次のコードは、10 スレッドすべてを一度に 2 つずつ実行し、Release()
10 回呼び出された後に「完了」を出力すると考えました。しかし、それは起こったことではありません:
int count = 0;
Semaphore s = new Semaphore(2, 2);
for (int x = 0; x < 10; x++)
{
Thread t = new Thread(new ThreadStart(delegate()
{
s.WaitOne();
Thread.Sleep(1000);
Interlocked.Increment(ref count);
s.Release();
}));
t.Start(x);
}
WaitHandle.WaitAll(new WaitHandle[] { s });
Console.WriteLine("done: {0}", count);
出力:
done: 6
私が探している機能を実装する唯一の方法が、EventWaitHandle
各スレッドにan を渡し、WaitAll()
それらの配列に対してa を実行することである場合、セマフォのみの配列に対してEventWaitHandles
a を実行する意味は何ですか? WaitAll()
つまり、待機中のスレッドのブロックが解除されるのはいつですか?