Вот простая реализация (из 9 многократно используемых параллельных структур данных и алгоритмов ):
Чтобы построить защелку обратного отсчета, вы просто
инициализировать его счетчик на п, и иметь
каждая подчиненная задача атомарно
уменьшите его на единицу, когда он закончится,
например, окружая
операция декремента с блокировкой или
с вызовом в Interlocked. Decrement.
Затем вместо операции взятия
поток может уменьшить и ждать
счетчик станет нулем; когда
проснулся, он будет знать, что п сигналов
были зарегистрированы с защелкой.
Вместо того, чтобы крутиться на этом условии,
как в то время как (считать! = 0), это обычно
хорошая идея, чтобы позволить поток ожидания
блок, в этом случае вам придется
использовать событие.
public class CountdownLatch {
private int m_remain;
private EventWaitHandle m_event;
public CountdownLatch(int count) {
m_remain = count;
m_event = new ManualResetEvent(false);
}
public void Signal() {
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait() {
m_event.WaitOne();
}
}