换句话说,我有一个线程可以多次启动并调用waitHandle.Set()
。然后我开始几个线程,每个线程都在等待WaitHandle
。它们的X会被标记,其中X是原始线程调用的次数waitHandle.Set()
?如果您调用EventWaitHandle.Set()X次,如果X线程尚未启动,它是否会发出X线程信号?
有没有一种结构支持我想要更紧密地完成的工作?
换句话说,我有一个线程可以多次启动并调用waitHandle.Set()
。然后我开始几个线程,每个线程都在等待WaitHandle
。它们的X会被标记,其中X是原始线程调用的次数waitHandle.Set()
?如果您调用EventWaitHandle.Set()X次,如果X线程尚未启动,它是否会发出X线程信号?
有没有一种结构支持我想要更紧密地完成的工作?
也许,但可能不是。
事件只能设置或不设置,如果没有任何事件可以取消设置,那么Set的重复调用不会改变它的状态,除非它是一个自动重置事件,并且至少有一个线程正在等待它。通过手动重置事件,等待(或开始等待)的任何线程将被释放,直到事件被解除。
我想你会真的想要一个信号,它确实有一个计数和支持设置ň次发布ñ线程(即使其中一些线程才开始等待后,一些通话设置)。
这取决于EventResetMode
。如果它设置为EventResetMode.AutoReset
它只会释放一个线程。如果它是'EventResetMode.ManualReset',但是它会释放在事件上被阻塞的所有线程。
Semaphore.Release(Int)
其中int是计数会做到这一点一个方式。
有没有办法让它释放X线程,其中X是调用waitHandle.Set()'的次数? – 2009-05-05 20:11:55
是的。将其创建为Auto。你想做什么?如果你能提供更多信息,我相信有更好的方法。正如下面提到的,你也可以使用信号量,但有些东西闻起来很腥。 – 2009-05-05 20:15:37
不,自动重置事件在这里不合适。你依赖于调用Set的线程只调用一次。如果事件在任何线程等待满足之前被设置了两次,那么只有一个等待线程运行。 – 2009-05-05 20:33:45
正如Richard所述,EventWaitHandles只有一个标志并且不能计算Set被调用的次数。添加计数变量的简单解决方案会导致竞争条件。
William Kempf有一个article为什么计数变量不起作用,以及使用.Net Monitor类的解决方案。
是的,我想要一个信号灯。我记得它的机制,但不是名字。自从我为资源池编写低级线程代码已经有一段时间了。 – 2009-05-05 20:23:25