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

时间:2016-09-06 16:19:45

标签: c++ multithreading c++11 gcc c++14

为什么以下代码导致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 - 如果互斥锁已被锁定且   阻止是不可能的

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

2 个答案:

答案 0 :(得分:5)

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

  

表达式m.lock()应格式正确,并具有以下语义:

     

要求:如果m的类型为std::mutex [...],则调用线程不拥有互斥锁。

答案 1 :(得分:0)

std::mutex已将nombre移除Library Issue #2309,因此g ++ 5.4可能只是最新的。