测试环境: Ubuntu 18.04.3 LTS g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0。
互斥锁可以重入吗?为什么下面的测试代码1通过了?
code1:
#include <iostream>
#include <mutex>
std::mutex g_mtx4val;
int g_val = 5;
void test() {
std::lock_guard<std::mutex> lck(g_mtx4val);
std::cout << "g_val=" << g_val << std::endl;
if (g_val > 0) {
--g_val;
test();
}
}
int main() {
test();
std::cout << "done ...." << std::endl;
return 0;
}peanut@peanut:~/demo$ g++ test.cpp
peanut@peanut:~/demo$ ./a.out
g_val=5
g_val=4
g_val=3
g_val=2
g_val=1
g_val=0
done ...code2:
// Same code 1
int main() {
std::thread t1(test);
t1.join();
std::cout << "done ...." << std::endl;
return 0;
}peanut@peanut:~/demo$ g++ test2.cpp -lpthread
peanut@peanut:~/demo$ ./a.out
g_val=5
^C
peanut@peanut:~/demo$ code2出现死锁。为什么code1可以通过测试?
发布于 2020-11-16 13:25:47
互斥提供了独占的、非递归的所有权语义
因此,标题中的问题的答案是否定的。
可以重入std::mutex吗?
不需要,但是如果你想要一个递归的互斥锁,std::recursive_mutex class就提供了这个功能。
为什么下面的测试代码1通过了?
你期望看到的行为是什么?互斥锁文档页面简单地写着:
在调用lock或try_lock之前,调用线程不能拥有互斥锁。
..。它没有说明如果调用线程违反了上面的规则会发生什么;这意味着一个违反规则的程序可能“看起来像是在工作”,但即便如此,它仍然是不正确的和有but的。
https://stackoverflow.com/questions/64853011
复制相似问题