首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::mutex是递归的(即不可重入的)吗?

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

Stack Overflow用户
提问于 2020-11-16 13:19:48
回答 1查看 174关注 0票数 3

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

互斥锁可以重入吗?为什么下面的测试代码1通过了?

code1:

代码语言:javascript
复制
#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;
}
代码语言:javascript
复制
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:

代码语言:javascript
复制
// Same code 1

int main() {
  std::thread t1(test);
  t1.join();

  std::cout << "done ...." << std::endl;
  return 0;
}
代码语言:javascript
复制
peanut@peanut:~/demo$ g++ test2.cpp -lpthread
peanut@peanut:~/demo$ ./a.out 
g_val=5
^C
peanut@peanut:~/demo$ 

code2出现死锁。为什么code1可以通过测试?

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 13:25:47

documentation page

互斥提供了独占的、非递归的所有权语义

因此,标题中的问题的答案是否定的。

可以重入std::mutex吗?

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

为什么下面的测试代码1通过了?

你期望看到的行为是什么?互斥锁文档页面简单地写着:

在调用lock或try_lock之前,调用线程不能拥有互斥锁。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64853011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档