Существует ли C# эквивалент Java CountDownLatch?

Существует ли C# эквивалент Java CountDownLatch?

2 ответа

Решение

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

Вот простая реализация (из 9 повторно используемых параллельных структур данных и алгоритмов):

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