std::conditional_variable_any的实现需要(在gcc和clang中(一个std::shared_ptr。
在wait
方法中,互斥锁的生存期将扩展到本地范围。
template<typename _Lock>
void
wait(_Lock& __lock)
{
shared_ptr<mutex> __mutex = _M_mutex; // <-- Extend lifetime of mutex.
unique_lock<mutex> __my_lock(*__mutex);
_Unlock<_Lock> __unlock(__lock);
// *__mutex must be unlocked before re-locking __lock so move
// ownership of *__mutex lock to an object with shorter lifetime.
unique_lock<mutex> __my_lock2(std::move(__my_lock));
_M_cond.wait(__my_lock2);
}
我想知道,为什么我们在这里需要这个?只要conditional_variable_any
对象存在,互斥锁就存在。一个std::mutex还不够吗?
代码已添加到此错误报告中: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54352
解释如下: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54185
c11 标准(草案 3337,第 30.5.1.5 段(指出,即使不是所有的 wait(( 调用都返回了,只要所有这些调用都阻塞了关联的锁而不是 *this,condition_variable也可能被破坏。
因此,必须延长使用寿命,以防止在互斥锁仍在使用时破坏互斥锁。