C++中死锁产生的原因与解决方法详解
发布时间: 2024-03-20 12:26:33 阅读量: 98 订阅数: 21
# 1. 理解死锁的概念
死锁是多线程编程中常见的问题,指两个或多个线程互相等待对方释放资源而无法继续执行的情况。在本章中,我们将深入探讨死锁的概念、产生条件以及其对程序的影响。
# 2. C++中死锁常见场景
在C++程序中,死锁是一个常见的并发编程问题,特别是在多线程编程中。下面将讨论一些C++中常见的死锁场景。
### 2.1 线程间资源竞争导致死锁
在多线程程序中,线程之间经常会竞争共享资源。如果多个线程试图同时占用两个或多个资源,而且这些资源又是互斥的(即一次只能被一个线程占用),那么就容易发生死锁。
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx1, mtx2;
void threadFunc1() {
std::lock_guard<std::mutex> lock1(mtx1);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> lock2(mtx2);
std::cout << "Thread 1 acquired both locks" << std::endl;
}
void threadFunc2() {
std::lock_guard<std::mutex> lock2(mtx2);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> lock1(mtx1);
std::cout << "Thread 2 acquired both locks" << std::endl;
}
int main() {
std::thread t1(threadFunc1);
std::thread t2(threadFunc2);
t1.join();
t2.join();
return 0;
}
```
在上面的示例中,线程1先尝试获取mtx1,然后休眠1秒,接着尝试获取mtx2;而线程2则相反。如果线程1获取了mtx1,但此时线程2已经获取了mtx2,那么它们将陷入死锁状态。
### 2.2 多线程间循环等待引发死锁
另一个常见的死锁场景是循环等待。也就是说,多个线程互相持有对方需要的资源,形成一个闭环,导致所有线程无法继续执行下去。
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx1, mtx2;
void threadFunc1() {
std::lock_guard<std::mutex> lock1(mtx1);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> lock2(mtx2);
std::cout << "Thread 1 acquired both locks" << std::endl;
}
void threadFunc2() {
std::lock_guard<std::mutex> lock2(mtx2);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex> lock1(mtx1);
std::cout << "Thread 2 acquired both locks" << std::endl;
}
```
0
0