用g ++进行递归lock()调用

Fro*_*art 2 c++ multithreading gcc c++11 c++14

为什么以下代码导致g ++ 5.4.0中出现死锁?

#include <mutex>

int main()
{
    std::mutex m;
    m.lock();
    m.lock();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,根据标准,此代码应导致异常:

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 - 如果互斥锁已被锁定且无法阻塞.

那怎么了?这是库中的错误吗?

Ker*_* SB 5

您的代码具有未定义的行为,因为您违反了前提条件([thread.mutex.requirements.mutex]):

表达式m.lock()应格式良好并具有以下语义:

要求:如果mstd::mutex[...] 类型,则调用线程不拥有互斥锁.