2

std::mutex是非递归的,违反它的是UB。所以理论上一切皆有可能(包括作为std::recursive_mutex)),但 libc++似乎工作正常,这个程序输出

再见

#include <iostream>
#include <mutex>

std::mutex m;
int main() {
    std::scoped_lock l1(m);
    std::scoped_lock l2(m);
    std::cout << "bye" << std::endl;
}

这是 libc++ 中的有意设计决定还是只是一些意外(例如,他们可以对互斥锁和递归互斥锁使用相同的逻辑)?

libstdc++ 挂起。

注意:我知道人们不应该依赖 UB,所以这不是关于最佳实践,我只是对晦涩的实现细节感到好奇。

4

2 回答 2

4

这似乎不是一个有意的设计决定。libc++ 的实现std::mutex只是平台的 POSIX 默认互斥体的包装。由于这也被定义为在递归锁定时具有 UB,因此它们只是继承了平台的默认 POSIX 互斥锁也恰好允许递归锁定的事实。

于 2021-01-12T11:38:06.443 回答
1

我得到相反的结果:libc++ 挂起而 libstdc++ 没有

原因是如果文件不是用 编译的-pthread,线程支持被禁用并且std::mutex::lock/unlock变成 noops。添加-pthread会使它们都按预期陷入僵局。

libc++ 在默认情况下是使用线程支持构建的,并且不需要-pthread标志,因此它std::mutex::lock确实获得了锁,从而产生了死锁。

于 2021-01-12T12:41:30.150 回答