gpt4 book ai didi

c++ - GCC C++11 条件变量等待内部机制

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:11 25 4
gpt4 key购买 nike

我正在寻找我们遇到的一个错误,一些困惑的线程/条件变量类被更新为使用 C++11 线程。在搜寻过程中,我在 GCC 代码库中遇到了以下内容:

  template<typename _Lock>
void
wait(_Lock& __lock)
{
unique_lock<mutex> __my_lock(_M_mutex);
_Unlock<_Lock> __unlock(__lock);
// _M_mutex must be unlocked before re-locking __lock so move
// ownership of _M_mutex lock to an object with shorter lifetime.
unique_lock<mutex> __my_lock2(std::move(__my_lock));
_M_cond.wait(__my_lock2);
}

尽管有评论,但我还是很难理解此处将构造函数移动到 __my_lock2 的目的。为什么这里的 __my_lock 移到了 __my_lock2 呢?

最佳答案

这看起来不像 condition_variable 代码。它看起来像 condition_variable_any 代码。后者有一个模板化的等待函数。前者没有。

N2406可能会阐明您所看到的内容。在 N2406 中,condition_variable_any 改为命名为 gen_cond_var,但除此之外,类型相同。本文描述了一个死锁场景,除非非常小心地确保 _M_mutex__lock 以非常特定的顺序锁定和解锁,否则就会出现死锁。

虽然您显示的代码与 N2406 处的代码不同,但我强烈怀疑它们都是为了按顺序锁定和解锁这两个锁而构建的,以避免 N2406 中描述的死锁。如果不深入了解 _Unlock 的定义,我不能绝对确定。然而,一个强有力的线索是 N2406 中这个等待函数的最终注释:

}  // mut_.unlock(), external.lock()

即必须在锁定外部 __lock 之前解锁成员互斥锁。通过将 __my_lock 移动到范围小于 __unlock 的局部变量,很可能正确排序

}  // _M_mutex.unlock(), __lock.lock()

已经实现了。要了解此顺序为何如此重要,您必须阅读 N2406 的相关部分(它可以防止死锁)。

关于c++ - GCC C++11 条件变量等待内部机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com