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-11-03 10:50 pm (UTC)
From: [identity profile] faceted-jacinth.livejournal.com
А!

Меня вот что запутало: я же правильно понимаю, что в очереди next никогда не должно быть больше одного кастомера, то есть её можно смело превратить в `Customer next;` и вместо `if (next.count > 0)` писать `if (next != null)`, ну а вместо `next.Dequeue` -- `customer = next; next = null`?

Тогда да, кажется тоже работает.

(no subject)

Date: 2009-11-03 10:54 pm (UTC)
From: [identity profile] faceted-jacinth.livejournal.com
или даже вообще, volatile bool barberPending. Чтобы как бы совсем понятно было.

(no subject)

Date: 2009-11-03 11:03 pm (UTC)
From: [identity profile] 109.livejournal.com
а это будет уже совсем непонятно. pending-то кастомер, а не барбер.

и куда его совать-то, этот volatile? вместо локов не получится, локи всё равно нужны. а тогда лишний point of synchronization. но всё равно не понимаю, куда.

(no subject)

Date: 2009-11-03 11:17 pm (UTC)
From: [identity profile] faceted-jacinth.livejournal.com
Эм, он volatile для того, чтобы компилятор не соптимизил доступ к нему.

В принципе может быть это и не нужно в данном конкретном случае -- lock сам по себе вроде бы является read-write barrier (но вот насчёт read не уверен, кстати!), однако над такими вещами лучше не задумываться излишне, по-моему.

Не, это barberAwakeningPending имелось в виду!

(no subject)

Date: 2009-11-04 02:05 am (UTC)
From: [identity profile] 109.livejournal.com
я знаю, зачем нужен volatile, я не понимаю, куда его тут совать. ну обнаружили мы, что нету барберов pending, дальше что? спинлочить? не думаю, что ты это имел в виду. код можешь написать?

и да, lock - это всегда both read and write barrier, (иначе бы не работало ничего).

(no subject)

Date: 2009-11-03 11:00 pm (UTC)
From: [identity profile] 109.livejournal.com
можно и так, но с двумя очередями очевиднее, что происходит (в явном виде употребляются слова enqueue и dequeue), и more generic - мало ли, в следующий раз по два кастомера брать надо будет.

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