2013-04-16 107 views
0

起初我是用boost::mutex::scoped_lock本身(这工作)的boost :: condition_variable与升压::互斥:: scoped_lock的

boost::mutex::scoped_lock lock(mutex_name); 
condition.wait(lock); //where condition = boost::condition_variable 

不过后来我换了锁,下面不工作

boost::lock_guard<boost::mutex> lock(mutex_name) 
condition.wait(lock); //Error 

有关如何解决问题的任何建议我收到智能感知错误,指出No instance of the overloaded function matches the argument list。编译错误是

Error 7 error C2664: 'void boost::condition_variable::wait(boost::unique_lock<Mutex> &)' : cannot convert parameter 1 from 'boost::lock_guard<Mutex>' to 'boost::unique_lock<Mutex> &' 
+0

只是一点:你永远不知道并发算法的工作原理。除非你用数学证明它。这是无法完成的,因为编译器和硬件不可证明。 –

回答

3

boost::lock_guard没有unlock成员函数,这是需要condition。使用unique_lock代替:

boost::unique_lock<boost::mutex> lock(mut); 
condition.wait(lock); 
+0

从我读到的是,unique_lock比lock_guard更先进。如果我使用unique_lock,我将不得不作出进一步的更改吗? – Rajeshwar

+0

@Rajeshwar更正,'lock_guard'是一个非常小的RAII锁定设施,它的功能不足以适应'condition'。您可以使用'lock_guard'而无需进行其他更改 - 它也是RAII锁,但具有附加功能。 –