Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有临界截面的增压条件变量当量_C++_Multithreading_Locking_Critical Section - Fatal编程技术网

C++ 具有临界截面的增压条件变量当量

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

目前,我的应用程序中有一个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
唯一的锁(一些互斥锁);
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_部分执行过程调用。