为什么这个双重互斥锁不会导致死锁?

ach*_*dzz 0 c++ multithreading mutex deadlock c++11

我在我的centos计算机上测试c ++ 11互斥.我尝试双重锁定此互斥锁以使其死锁.但是在我运行它之后,一切都很好并且没有发生死锁.

#include <thread>
#include <mutex>
#include <iostream>
std::mutex m;
int main()
{
  m.lock();
  m.lock();
  std::cout<<"i am ok"<<std::endl;

  return 0;  
}
Run Code Online (Sandbox Code Playgroud)

编译器是g ++ 4.8.5 in centos 3.10.0-327.36.3.el7.x86_64:

[zzhao010@localhost shareLibPlay]$ ./3.out
i am ok
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 9

锁定一个std::mutex已经被同一个线程锁定的行为未定义的行为,因此它可能会起作用,它可能会失败,它可能会喝掉所有的啤酒并扔在沙发上.没有保证.


sky*_*ack 8

如果您调用lock两次,则行为未定义.
它的工作方式正如您所期望的那样,确实是一种有效的未定义行为.

有关详细信息,请参见此处