23

Java のCountDownLatchに相当する C# はありますか?

4

2 に答える 2

25

.NET Framework バージョン 4 には、新しいSystem.Threading.CountdownEventクラスが含まれています。

于 2009-12-07T01:24:25.690 に答える
17

これは簡単な実装です(9つの再利用可能な並列データ構造とアルゴリズムから):

カウントダウン ラッチを構築するには、そのカウンターを n に初期化し、各従属タスクが終了時にアトミックに 1 ずつ減分するようにします。たとえば、デクリメント操作をロックまたは Interlocked.Decrement の呼び出しで囲みます。次に、テイク操作の代わりに、スレッドはデクリメントしてカウンターがゼロになるのを待つことができます。起動すると、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();
    }
}
于 2009-12-07T01:21:08.787 に答える