举一个C++代码的死锁例子
时间: 2024-09-27 10:16:51 浏览: 24
C++中的死锁示例通常涉及到互斥锁(mutex)和条件变量(condition_variable),这里是一个简化的例子:
```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx1;
std::mutex mtx2;
std::condition_variable cv1, cv2;
void threadA() {
std::unique_lock<std::mutex> lock(mtx1);
cv1.notify_one(); // 先释放锁1并唤醒线程B
std::unique_lock<std::mutex> lock2(mtx2); // 现在线程A持有锁2
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
cv2.notify_one(); // 然后尝试唤醒线程B
}
void threadB() {
std::unique_lock<std::mutex> lock(mtx2);
cv2.wait(lock, []{ return cv1.count() > 0; }); // 线程B等待锁1被解锁
std::unique_lock<std::mutex> lock1(mtx1); // 当B获得锁1时,它会永远等待,因为A也持有了锁2
cv1.notify_one();
}
int main() {
std::thread t1(threadA), t2(threadB);
t1.join();
t2.join();
return 0;
}
```
在这个例子中,线程A先获取了`mtx1`,然后通知线程B。然而,在线程B进入临界区之前,它首先获取了`mtx2`,这就形成了一个循环:线程A持有`mtx2`,无法释放给线程B;线程B持有`mtx1`,也无法释放给A。当线程A试图唤醒B时,B已经不可能从`mtx1`中解脱出来,因此造成了死锁。