【发布时间】:2026-01-19 21:20:03
【问题描述】:
为什么下面的代码会导致g++ 5.4.0出现死锁?
#include <mutex>
int main()
{
std::mutex m;
m.lock();
m.lock();
}
据我所知,根据标准,这段代码应该会导致异常:
30.4.1.2 互斥类型 [thread.mutex.requirements.mutex]
6 表达式 m.lock() 应具有良好的格式并具有以下内容 语义:
[...]
12 抛出:需要异常时的 system_error (30.2.2)。
13 错误条件:
(13.1) — operation_not_permitted — 如果线程没有 执行操作的权限。
(13.2) — resource_deadlock_would_occur — 如果实现检测到 会发生死锁。
(13.3) — device_or_resource_busy — 如果互斥锁已被锁定并且 无法阻止。
那怎么了?是图书馆的bug吗?
【问题讨论】:
-
当你使用
std::lock_guard做同样的事情时会发生什么?可能是lock有一些未指定的细节,例如检测同一线程上的递归。 -
@Joachim Pileborg 已编辑
-
requires 子句指定调用函数的前提条件(7.5.1.4(3.1))。如果不满足,你有 UB (7.6.4.11)。
标签: c++ multithreading c++11 gcc c++14