0

我目前在我的应用程序中有一个 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 是用condition_var.notifyone()方法触发的,不幸的是,这个方法需要 boost::mutex 才能起作用。我计划删除 boost::mutex 并使用提供的 CRITICAL_SECTION 窗口。但是我相信 boost 条件不适用于 windows CRITICAL_SECTION 关于我的选项可能是什么建议用 CRITICAL_SECTION 替换 boost::mutex 并在上面的代码中进行最小的更改?

4

1 回答 1

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); 
  }
  ...
}
于 2013-07-03T11:07:43.247 回答