为什么condition_variable_any需要一个由shared_ptr管理的互斥体?

时间:2019-07-16 09:05:35

标签: c++ multithreading mutex resource-management

std :: conditional_variable_any的实现(在gccclang中)需要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是否足够?

1 个答案:

答案 0 :(得分:4)

此错误报告中添加了代码: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()调用都返回,condition_variable也可能被破坏,只要所有这些调用都在关联的锁而不是* this上阻塞

因此必须延长使用寿命,以防止互斥量仍在使用中而破坏它。