Win32事件与信号量

时间:2010-05-11 13:04:55

标签: c++ multithreading winapi events semaphore

基本上我需要替换Condition Variable和SleepConditionVariableCS,因为它只支持Vista和UP。 (对于C ++)

有人建议使用Semaphore,我也找到了CreateEvent。

基本上,我需要在WaitForSingleObject上进行线程等待,直到有一个或多个其他线程告诉我有事情可做。

我应该在哪种情况下使用Semaphore vs Win Event?

由于

3 个答案:

答案 0 :(得分:3)

在你的情况下,我会自己使用一个活动。当您希望线程开始时发出信号。完成工作:))

编辑:信号量和事件之间的差异归结为内部计数。如果有多个ReleaseSemaphores,那么也将释放2个WaitForSingleObjects。事件本质上是布尔。如果两个不同的位置同时发生信号事件,则等待将被释放并且将被设置回无信号(取决于您是否具有自动或手动重置)。如果您需要同时从多个位置发出信号并且等待线程运行两次,那么此事件行为可能会导致死锁。

答案 1 :(得分:3)

在一般情况下,更换Windows上的条件变量非常困难且容易出错。之一:

  1. 使用其他人的实施(例如Boost.Thread)。
  2. 重新思考您尝试解决的问题,看看Win32是否可以解决这个问题。根据您的描述,一个事件可能就足够了,但如果服务员需要由其他线程设置的某个条件表达式触发,而不仅仅是一个信号,那么最好回到选项1.

答案 2 :(得分:3)

尽可能使用boost::condition_variable。我之前一直走在这条路上(参见microsoft.public.win32.programmer.kernel上的消息)并且Win32事件API不够用;使用事件时遇到问题。