.NET Framework версии 4 включает новый класс System.Threading.CountdownEvent .
Вот простая реализация (из 9 многоразовых параллельных структур данных и алгоритмов ):
Чтобы создать защелку обратного отсчета, вы просто инициализировать его счетчик на n и иметь каждая подчиненная задача атомарно уменьшите его на единицу, когда он закончится, например, окружая операция уменьшения с блокировкой или с вызовом Interlocked.Decrement. Тогда вместо операции взятия поток может уменьшиться и ждать счетчик стать нулевым; когда проснулся, он будет знать, что n сигналов были зарегистрированы с защелкой. Вместо того, чтобы вращаться по этому условию, как в while (count! = 0), обычно хорошая идея позволить ожидающему потоку блок, и в этом случае вам нужно использовать событие.
открытый класс CountdownLatch { частный int m_remain; private EventWaitHandle m_event; public CountdownLatch (int count) { m_remain = количество; m_event = новый ManualResetEvent (false); } public void Signal () { // Последний поток для сигнала также устанавливает событие. если (Interlocked.Decrement (ref m_remain) == 0) m_event.Set (); } public void Wait () { m_event.WaitOne (); } }