2009-12-07 4 views

ответ

19

В .NET Framework версии 4 включает в себя новый System.Threading.CountdownEvent класс.

+0

Я собираюсь сравнить оба ответа, и мне, возможно, придется вручить его вам (CesarGon) ... кажется, что ваш лучше, потому что вы предлагаете решение, которое уже встроено в C#. – Kiril

+0

Это справедливо, Лирик. :-) – CesarGon

16

Вот простая реализация (от 9 Reusable Parallel Data Structures and Algorithms):

Чтобы построить обратный отсчет задвижку, вы просто инициализировать счетчик на п, и имеет каждый подчиненной задачи атомарна декрементирует один, когда он заканчивает , , например, окружая операцию декремента с блокировкой или с призывом к блокировке. Затем, вместо того, чтобы выполнить операцию, нить может уменьшаться и ждать счетчик, чтобы стать нулевым; когда проснулся, он будет знать, что n сигналов были зарегистрированы с защелкой. Вместо того, чтобы вращаться по этому условию, , как и во время (count! = 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(); 
    } 
} 
Смежные вопросы