C++ 多线程的错误和如何避免(8)

不要重复获取同一个锁

问题:在获得一个锁并且没有释放该锁的前提下,再次尝试获取该锁会报错。

比如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <thread>
#include <mutex>
 
std::mutex mu;
 
static int counter = 0;
 
 
void StartThruster()
{
  try
  {
    // Some operation to start thruster
  }
  catch (...)
  {
    std::lock_guard<std::mutex> lock(mu);
    std::cout << "Launching rocket" << std::endl;
  }
}
 
void LaunchRocket()
{
  std::lock_guard<std::mutex> lock(mu);
  counter++;
  StartThruster();
}
 
int main()
{
  std::thread t1(LaunchRocket);
  t1.join();
  return 0;
}

该段程序在正常情况下不会报错,只有发现异常操作时,在捕获异常时,会调用 

1
2
std::lock_guard<std::mutex> lock(mu);
std::cout << "Launching rocket" << std::endl;

然后会报错。

 

 

解决方法也很简单,就是不要尝试获取已经被获取的锁

posted @   strive-sun  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示