проблема спящего брадобрея
Oct. 27th, 2009 11:22 pmа вот это, наоборот, явно можно сделать проще, даже когда брадобреев много.
// вначале семафор закрыт
newCustomer = new AutoResetEvent(false);
// customer reception thread[s]
lock (queue) {
if (queue.Size == maxSize)
throw "нет мест";
queue.Enqueue(сustomer);
newCustomer.Set(); // open semaphore
}
// each barber's thread
while (true) {
newCustomer.WaitOne(); // let one barber through and close
lock (queue) {
if (queue.IsEmpty)
continue;
customer = queue.Dequeue();
}
Shave(customer);
}собственно, этот же код решает и проблему продюсеров-консъюмеров, вместо того, что там написано (на буфер памяти нет, а спящие треды копить память есть, да?)
(no subject)
Date: 2009-11-04 02:05 am (UTC)и да, lock - это всегда both read and write barrier, (иначе бы не работало ничего).