死锁例子学习
转自: 面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!_哈工大分出了多少学校-CSDN博客
1.介绍
。产生死锁的原因,主要包括:
- 系统资源不足;如果系统资源充足,进程的资源请求都能够得到满足,那么死锁出现的可能性就很低;否则就会因争夺有限的资源而陷入死锁。
- 程序执行的顺序有问题;
- 资源分配不当等。
产生死锁的四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2.例子
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex lock1; // 对应 LOCK_1
std::mutex lock2; // 对应 LOCK_2
void threadA() {
try {
while (true) {
std::lock_guard<std::mutex> guard1(lock1); // 锁住 lock1
std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> guard2(lock2); // 锁住 lock2
std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
}
} catch (const std::exception& e) {
std::cerr << "Exception in threadA: " << e.what() << std::endl;
}
}
void threadB() {
try {
while (true) {
std::lock_guard<std::mutex> guard2(lock2); // 锁住 lock2
std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> guard1(lock1); // 锁住 lock1
std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
}
} catch (const std::exception& e) {
std::cerr << "Exception in threadB: " << e.what() << std::endl;
}
}
int main() {
std::thread t1(threadA);
std::thread t2(threadB);
t1.join();
t2.join();
return 0;
}
解决方案: 1)修改加锁顺序一致。2)等不到另一个锁时就释放已获取的锁。