简要分析 gdb 定位死锁
# 一、代码示例
- 以下代码中,两个线程分别执行
threadFunc1
和threadFunc1
,两个函数都是先对自己的锁加锁,再分别去对对方的锁加锁,再给对方锁加锁时会相互等待对方释放锁,造成死锁; - 可以通过
g++ -std=c++11 -pthread -o m m.cpp
生成二进制文件;
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mutex1, mutex2;
void threadFunc1() {
std::lock_guard<std::mutex> lock1(mutex1); // 析构自动释放
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待一段时间,增加死锁发生的概率
std::lock_guard<std::mutex> lock2(mutex2);
// 这里可能会发生死锁
std::cout << "Thread 1 acquired both mutexes" << std::endl;
}
void threadFunc2() {
std::lock_guard<std::mutex> lock2(mutex2);
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待一段时间,增加死锁发生的概率
std::lock_guard<std::mutex> lock1(mutex1);
// 这里可能会发生死锁
std::cout << "Thread 2 acquired both mutexes" << std::endl;
}
int main() {
std::thread t1(threadFunc1);
std::thread t2(threadFunc2);
t1.join();
t2.join();
return 0;
}
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
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
编辑 (opens new window)
上次更新: 2024/06/28, 11:37:53