今天在学习std::recursive_mutex
的时候看到std::recursive_mutex
的应用场景是可重入申请锁,于是写了代码进行测试,确实在循环调用的时候不会出现死锁了。之后又用mutex
进行了测试,但是发现在不同场景下会有不同的情况,代码如下:
#include <iostream>
#include <mutex>
std::recursive_mutex recursive_mutex_;
std::mutex mutex_;
void func(int n) {
std::lock_guard<std::mutex> lock(mutex_);
std::cout << "n = " << n << std::endl;
if (n > 0) {
func(n - 1);
}
}
int main() {
func(5);
return 0;
}
按照预期,以上代码应该在打印了 5 之后就一直卡主,可是在 gcc 7.5 下,直接打印了 5 4 3 2 1 ;测试了很多在线编译器都是这个现象,只有https://www.onlinegdb.com/online_c++_compiler 这个在线编译器的运行结果符合预期。
请问各位大佬,这个现象的原因是什么? 应该不是 lock_guard 的问题,因为我自己手写了 lock_guard 查看了 lock 的声明周期,确实是在 func 执行结束之后才 unlock 。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.