【问题标题】:options for condition variable in windows server 2003windows server 2003 中的条件变量选项
【发布时间】:2013-05-14 09:44:16
【问题描述】:

Windows Server 2003/Win Xp 不支持条件变量,在 win server 2003 中条件变量的功能还有哪些其他选项?

【问题讨论】:

  • 要么您选择不支持 Windows XP,要么您必须应对操作系统提供的功能,如果前者不是一个选项。
  • @MichaelWalz 我正在寻找条件变量的替代品...有吗?
  • 您可以从已经存在的原语中构建条件变量。请参阅 boost 对 boost::thread::condition_variable 的实现。 Documentation, Source
  • @gimpf 不只是“看”,使用。
  • 你说得非常正确。

标签: c++ multithreading winapi


【解决方案1】:

关键部分、互斥体、信号量、事件。 Windows 具有所有常用的同步原语。

【讨论】:

  • 不,为什么?这是一个有用的答案。一个事件是一个条件变量,如果你想这样看待它——只是少糖。
  • 所有常用的同步原语?重要的原语是互斥体和条件变量;其他的可以从它们合成(但如果直接在内核中实现可能会更有效)。在那之后,最有用的是 rwlock。
  • -1:Windows 事件肯定不是条件变量。 OP专门询问条件变量。请参阅cs.wustl.edu/~schmidt/win32-cv-1.html,了解使用 Event 实现类似条件变量的功能有多难。条件变量的价值在于它们原子地释放互斥体并开始等待。试图用事件模拟这一点而不遇到微妙的错过信号比赛真的很难。
  • ..这就是为什么我考虑改为评论的原因。 “重要的原语是互斥体和条件变量”至少是有争议的。信号量和互斥锁在我使用的每一个多任务操作系统上都可用......永远。对于条件变量来说,这比可以说的要多——一种类似监视器的构造,在某些操作系统上,它实际上往往不能正常工作。 Windows 信号量、临界区和互斥锁不会受到虚假唤醒(AKA '虚假故障')的影响。
  • 虚假唤醒是一个红鲱鱼。它是solved in C++11,并且无关紧要,因为您需要 while 循环(隐式或显式)以任何方式测试您的不变量。但这艘船已经航行了。 C++11 委员会和 pthreads 委员会都选择条件变量而不是信号量或事件。 stackoverflow.com/questions/70773/… 就是一个很好的例子。 Cvar 在开始/结束等待的同时以原子方式释放/获取互斥锁。信号量和事件不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多