我目前在我的应用程序中有一个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而上面代码中的变化最小?
答案 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);
}
...
}