![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Unknown |
![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 104 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Проблема спящего брадобрея
Действие еще одной классической проблемной ситуации межпроцессного взаимодействия разворачивается в парикмахерской. В парикмахерской есть один брадобрей, его кресло и п стульев для посетителей. Если желающих воспользоваться его услугами нет, брадобрей сидит в своем кресле и спит. Если в парикмахерскую приходит клиент, он должен разбудить брадобрея. Если клиент приходит и видит, что брадобрей занят, он либо садится на стул (если есть место), либо уходит (если места нет). Необходимо запрограммировать брадобрея и посетителей так, чтобы избежать состояния состязания. У этой задачи существует много аналогов в сфере массового обслуживания, например информационная служба, обрабатывающая одновременно ограниченное количество запросов, с компьютеризированной системой ожидания для запросов. Это задание. Возник вопрос не совсем относящийся к теме: есть ли аналог глобальных переменных в С#? т.е. мне нужно, чтобы переменная, обозначающая кол-во посетителей, была доступна во всей программе. В дальнейшем, думаю, вопросы еще возникнут - вот и создал тему. -------------------- go ask Alice
|
![]() ![]() |
Unknown |
![]()
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 104 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
В общем, вот, что у меня получилось:
Код using System; using System.Threading; class Barber { public static int barbers = 1; public static int chairs = 5; public static int customers = 0; public static Random r = new Random(); class Customer { public bool served; public Thread thrd; public Customer(string name) { served = false; thrd = new Thread(new ThreadStart(this.run)); thrd.Name = name; thrd.Start(); } public void run() { Console.WriteLine(thrd.Name + " пришел."); do { if (barbers > 0) //брадобрей свободен { barbers--; served = true; } else { //брадобрей занят if (customers < chairs) customers++; //клиент ждет else { Console.WriteLine(thrd.Name + " ушел."); return; //клиент ушел(нет мест) } } customers--; } while (!served); Console.WriteLine(thrd.Name + " обслуживается."); Thread.Sleep(500); customers--; barbers++; Console.WriteLine(thrd.Name + " обслужен."); } } class MultiThread { public static void Main() { Customer c1 = new Customer("Клиент #1"); Customer c2 = new Customer("Клиент #2"); Customer c3 = new Customer("Клиент #3"); Customer c4 = new Customer("Клиент #4"); Customer c5 = new Customer("Клиент #5"); Console.ReadKey(); } } } Вроде все работает как задумано - это нормальное решение? Сообщение отредактировано: Unknown - 27.04.2008 19:07 -------------------- go ask Alice
|
![]() ![]() |
![]() |
Текстовая версия | 25.07.2025 17:10 |