如果你调用EventWaitHandle.Set()X次,如果X线程尚未启动,它是否会发出X线程的信号?

时间:2009-05-05 20:05:01

标签: c# multithreading

换句话说,我有一个线程可以启动并多次调用waitHandle.Set()。然后我开始几个线程,每个线程都在等WaitHandle。是否会发出X的信号,其中X是原始线程称为waitHandle.Set()的次数?

是否有一种结构可以支持我正在努力完成的任务?

3 个答案:

答案 0 :(得分:9)

可能,但可能不是。

只能设置或取消设置事件,如果没有任何内容可以取消设置事件,则重复调用Set将不会更改其状态,除非它是自动重置事件并且至少有一个线程在等待它。通过手动重置事件,任何等待(或开始等待)的线程都将被释放,直到某些事件取消设置。

我认为你实际上需要一个信号量,它有一个计数并支持设置 n 次以释放 n 线程(即使其中一些线程只开始等待在设置了一些调用后。)

答案 1 :(得分:3)

取决于EventResetMode。如果设置为EventResetMode.AutoReset,它将只释放一个线程。如果是'EventResetMode.ManualReset',它将释放在事件上阻止的所有线程。

Semaphore.Release(Int)

对于Int,计数将是一种方式。

答案 2 :(得分:1)

正如Richard所说,Eve​​ntWaitHandles只有一个标志,无法计算Set被调用的次数。添加计数变量的简单解决方案会导致竞争条件。

William Kempf有一个article关于计数变量不起作用的原因,以及一个使用.Net Monitor类的解决方案。