gpt4 book ai didi

c++ - std::mutex 是递归的(即不可重入)吗?

转载 作者:行者123 更新时间:2023-12-03 07:00:14 24 4
gpt4 key购买 nike

测试环境:Ubuntu 18.04.3 LTS g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0。

std::mutex 可以重入吗?为什么下面的测试代码1会通过?

代码1:

#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 ...

代码2:

// 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可以通过测试?

最佳答案

来自documentation page :

mutex offers exclusive, non-recursive ownership semantics

所以标题问题的答案是否定的。

Can std::mutex be reentrant?

不,但是如果你想要一个递归互斥锁,std::recursive_mutex class提供该功能。

Why does the following test code 1 pass?

您希望看到什么行为? std::mutex 文档页面简单地说:

A calling thread must not own the mutex prior to calling lock or try_lock.

...它没有说明如果调用线程违反上述规则会发生什么;这意味着违反规则的程序可能“看起来可以工作”,但即便如此仍然是不正确的和错误的。

关于c++ - std::mutex 是递归的(即不可重入)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64853011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com