与CRITICAL_SECTION等效的Boost条件变量

时间:2013-07-02 14:46:54

标签: c++ multithreading locking critical-section

我目前在我的应用程序中有一个boost :: mutex代码部分,看起来像这样

{//Lock
boost::unique_lock<boost::mutex> lock(some_mutex);
   while(container.empty()) 
   { 
     condition_var.wait(lock); 
   }/*Block if empty - for spurious wakeup*/ 
 ......
 ,,,,,,
}//Unlock

现在some_mutex的类型为boost :: mutex 和condition_var的类型为boost :: condition_variable

现在用condition_var.notifyone()方法触发condition_var,遗憾的是这个方法需要boost :: mutex才能运行。 我打算删除boost :: mutex并使用提供CRITICAL_SECTION的窗口。但是我认为提升条件不适用于Windows CRITICAL_SECTION 关于我的选项可能是什么建议用CRITICAL_SECTION替换boost :: mutex而上面代码中的变化最小?

1 个答案:

答案 0 :(得分:1)

您可以将boost::condition_variable_any与任何类似互斥锁的对象CRITICAL_SECTION一起使用。 (正如DaveS评论所说)

但是,我强烈建议您进行分析速度,并将您的第一个简单版本与以下代码进行比较。

#include <windows.h>
#include <boost/thread/condition_variable.hpp>

// wrapper class for CriticalSection
class win32cs_mutex : boost::noncopyable {
public:
  win32cs_mutex()  { ::InitializeCriticalSection(&cs_); }
  ~win32cs_mutex() { ::DeleteCriticalSection(&cs_); }
  void lock()   { ::EnterCriticalSection(&cs_); }
  void unlock() { ::LeaveCriticalSection(&cs_): }
private:
  CRITICAL_SECTION cs_;
};

win32cs_mutex some_mutex;
boost::condition_variable_any condition_var;

// client code
{
  boost::unique_lock<win32cs_mutex> lock(some_mutex);
  while(container.empty()) 
  {
    condition_var.wait(lock); 
  }
  ...
}