为什么锁没锁?

时间:2014-03-05 16:15:52

标签: c++11 locking mutex

我有这个最小的代码:

#include <mutex>
#include <iostream>

std::mutex themutex;

void f1()
{ 
  std::cout << "1" << std::endl;
  std::lock_guard<std::mutex> local_mutex(themutex);
  std::cout << "2" << std::endl;
}

void f2()
{
  std::cout << "3" << std::endl;
  std::lock_guard<std::mutex> local_mutex(themutex);
  std::cout << "4" << std::endl;
  f1();
  std::cout << "5" << std::endl;
}

int main(void)
{
  f2();
  return 0;
}

我用

编译并运行
g++ -std=c++11 test_mutex.cc -o test_mutex && ./test_mutex

我得到了这个输出:

3
4
1
2
5

为什么呢?

我希望程序在打印“1”后锁定,永远不会返回。

1 个答案:

答案 0 :(得分:3)

从30.4.1(“互斥要求”):

  

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

     

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

您违反了要求,因此您不能指望标准保证任何行为。