我认为下面的代码会让所有 10 个线程运行,一次运行两个,然后在Release()
调用 10 次后打印“done”。但事实并非如此:
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
如果实现我正在寻找的功能的唯一方法是将 a 传递EventWaitHandle
给每个线程,然后WaitAll()
在这些数组上执行 a ,那么在只有一个信号量的数组上EventWaitHandles
执行 a 的含义是什么?WaitAll()
换句话说,等待线程什么时候解除阻塞?