代码之家  ›  专栏  ›  技术社区  ›  Orion Adrian

如果调用eventwithandle.set()x次,如果x线程还没有启动,它会向x线程发出信号吗?

  •  5
  • Orion Adrian  · 技术社区  · 15 年前

    换句话说,我有一个线程启动并调用 waitHandle.Set() 多次。然后我启动几个线程,每个线程都在等待 WaitHandle . 其中x是原始线程调用的次数吗? waithandle.set()。 ?

    是否有一个结构可以支持我正在努力实现的更紧密的目标?

    3 回复  |  直到 14 年前
        1
  •  9
  •   Richard    14 年前

    可能,但可能不是。

    事件只能设置或取消设置,如果没有要取消设置的内容,则重复调用set不会更改其状态,除非它是自动重置事件,并且至少有一个线程在等待它。对于手动重置事件,任何等待(或开始等待)的线程都将被释放,直到有什么东西取消设置该事件为止。

    我认为您实际上需要一个信号量,它有一个计数并支持设置 n 释放时间 n 线程(即使某些线程只在某些要设置的调用之后才开始等待)。

        2
  •  3
  •   Matt Davison    15 年前

    这取决于 EventResetMode . 如果设置为 EventResetMode.AutoReset 它只会释放一个线程。但是,如果它是“eventreestmode.manuallreset”,它将释放在事件上阻塞的所有线程。

    Semaphore.Release(Int)
    

    其中int是计数 这样做的方法。

        3
  •  1
  •   Dour High Arch    15 年前

    正如Richard所说,EventWaitHandles只有一个标志,不能计算调用设置的次数。添加一个计数变量的简单解决方案会导致一个竞争条件。

    威廉·肯普夫有一个 article 关于为什么计数变量不起作用,以及使用.NET监视器类的解决方案。