Joh*_*ith 7 .net c# multithreading semaphore waithandle
我认为下面的代码会让所有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);
Run Code Online (Sandbox Code Playgroud)
输出:
done: 6
Run Code Online (Sandbox Code Playgroud)
如果实现我正在寻找的功能的唯一方法是传递一个EventWaitHandle
到每个线程,然后WaitAll()
在那些数组上做一个EventWaitHandles
,那么WaitAll()
在一个只有一个信号量的数组上做什么是什么意思?换句话说,等待线程何时解除阻塞?
WaitHandle.WaitAll
等待所有处理程序都处于信号状态.
所以,当你调用WaitHandle.WaitAll
上一个 WaitHandle
它的工作原理一样,你打电话s.WaitOne()
例如,您可以使用以下代码等待所有已启动的线程,但允许两个线程并行运行:
int count = 0;
Semaphore s = new Semaphore(2, 2);
AutoResetEvent[] waitHandles = new AutoResetEvent[10];
for (int x = 0; x < 10; x++)
waitHandles[x] = new AutoResetEvent(false);
for (int x = 0; x < 10; x++)
{
Thread t = new Thread(threadNumber =>
{
s.WaitOne();
Thread.Sleep(1000);
Interlocked.Increment(ref count);
waitHandles[(int)threadNumber].Set();
s.Release();
});
t.Start(x);
}
WaitHandle.WaitAll(waitHandles);
Console.WriteLine("done: {0}", count);
Run Code Online (Sandbox Code Playgroud)
WaitHandle.WaitAll(new WaitHandle[] { s });
等待就像s.WaitOne();
。它一有机会就进入。您似乎期望此调用等待所有其他信号量操作,但操作系统无法区分其中的差异。该命令很可能是第一个被授予访问信号量的命令。
我认为你需要的是Barrier
课程。它是为 fork-join 式的并行性而设计的。
归档时间: |
|
查看次数: |
7753 次 |
最近记录: |