我有这个最小的代码:
#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”后锁定,永远不会返回。
答案 0 :(得分:3)
从30.4.1(“互斥要求”):
表达式
m.lock()
应格式正确,并具有以下语义:要求:如果
m
的类型为std::mutex
或std::timed_mutex
,则调用线程不拥有互斥锁。
您违反了要求,因此您不能指望标准保证任何行为。