【问题标题】:boost::condition_variable with boost::mutex::scoped_lockboost::condition_variable 和 boost::mutex::scoped_lock
【发布时间】:2013-04-16 17:36:34
【问题描述】:

最初我使用的是boost::mutex::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> &'  

【问题讨论】:

  • 只是一点:你永远不知道并发算法是有效的。除非你在数学上证明它。这无法完成,因为编译器和硬件无法证明。

标签: boost locking boost-thread


【解决方案1】:

boost::lock_guard 没有unlock 成员函数,这是condition 所需要的。请改用unique_lock

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

【讨论】:

  • 据我所知,unique_lock 比 lock_guard 更先进。如果我使用 unique_lock 是否需要进行任何进一步的更改?
  • @Rajeshwar 正确,lock_guard 是一个非常微不足道的 RAII 锁定工具,它的功能不足以满足 condition。您可以使用 lock_guard 而无需进行额外更改 - 它也是 RAII 锁,但具有额外功能。
猜你喜欢
  • 2011-01-17
  • 2011-02-22
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多