C++ 具有临界截面的增压条件变量当量
目前,我的应用程序中有一个boost::mutex代码部分,看起来像这样C++ 具有临界截面的增压条件变量当量,c++,multithreading,locking,critical-section,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 {//Lock
{//Lock
boost::unique_lock<boost::mutex> lock(some_mutex);
while(container.empty())
{
condition_var.wait(lock);
}/*Block if empty - for spurious wakeup*/
......
,,,,,,
}//Unlock
{//Lock
唯一的锁(一些互斥锁);
while(container.empty())
{
条件变量等待(锁定);
}/*如果为空,则阻塞-用于虚假唤醒*/
......
,,,,,,
}//解锁
现在有些互斥是boost::mutex类型的
条件_变量的类型为boost::条件_变量
现在,使用condition\u var.notifyone()
方法触发condition\u var。不幸的是,此方法需要boost::mutex才能正常工作。
我计划删除boost::mutex并使用windows提供的关键部分。但是,我相信,在windows临界_部分中,boost条件不起作用
关于我的选项是用关键部分替换boost::mutex,并在上述代码中进行最小更改,有什么建议吗?您可以将
boost::condition\u变量\u any
用于任何类似互斥对象的关键部分
。(正如戴维评论说的那样)
但是,我强烈建议您加快评测速度,并将您的第一个简单版本与以下代码进行比较
#包括
#包括
//CriticalSection的包装器类
类win32cs\u互斥体:boost::noncopyable{
公众:
win32cs_mutex(){::InitializeCriticalSection(&cs_u);}
~win32cs_mutex(){::DeleteCriticalSection(&cs_);}
void lock(){::EnterCriticalSection(&cs)}
void unlock(){::LeaveCriticalSection(&cs\)}
私人:
临界截面cs;
};
win32cs_互斥一些_互斥;
boost::条件变量任意条件变量;
//客户端代码
{
唯一的锁(一些互斥锁);
while(container.empty())
{
条件变量等待(锁定);
}
...
}
您需要将关键部分代码封装在一个提供锁定/解锁方法的类中,然后您可以使用boost::condition\u variable\u any
,该类接受任何实现可锁定概念的类。为什么要替换?boost::mutex在功能上等同于CRITICAL_部分。我非常怀疑CRITICAL_部分
比boost::mutex
快。查看boost\thread\win32\basic\u timed\u mutex.hpp。这就是内联到代码中的内容。在非竞争互斥的常见情况下,它基本上是一个内联测试集。CRITICAL_部分执行过程调用。