109: (Default)
[personal profile] 109
а вот это, наоборот, явно можно сделать проще, даже когда брадобреев много.

// вначале семафор закрыт
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-10-28 08:06 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Я, кстати, почитал ту задачу, и тоже не понял, в чём проблема. Достаточно ввести ещё одну entity ("стулья", в твоём варианте queue), и вся синхронизация сводится к двум парам, очередь-клиент и очередь-парикмахер.

(no subject)

Date: 2009-10-28 09:48 pm (UTC)
From: [identity profile] 109.livejournal.com
дык кстати стулья-то там есть (клиент же ищет свободный стул).

перефразируя известную поговорку, all concurrency problems can be solved by adding another queue.

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags