为什么以下代码导致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 - 如果互斥锁已被锁定且 阻止是不可能的。
那怎么了?它是库中的错误吗?
答案 0 :(得分:5)
您的代码有未定义的行为,因为您违反了前提条件([thread.mutex.requirements.mutex]):
表达式
m.lock()
应格式正确,并具有以下语义:要求:如果
m
的类型为std::mutex
[...],则调用线程不拥有互斥锁。
答案 1 :(得分:0)
std::mutex
已将nombre
移除Library Issue #2309,因此g ++ 5.4可能只是最新的。