给我一个死锁的简单代码,c++
时间: 2024-10-23 21:21:07 浏览: 31
C++ 多线线程,生产者消费者
在C++中,死锁通常发生在多线程环境下,当两个或更多的线程相互等待对方释放资源而无法继续执行时,就会发生死锁。下面是一个简单的死锁示例,涉及两个互斥资源(mutexes)以及条件变量(condition_variable):
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
// 定义资源
std::mutex mtx1, mtx2;
bool resource1 = true, resource2 = false;
// 线程A
void threadA() {
std::unique_lock<std::mutex> lock(mtx1);
std::cout << "Thread A acquired resource 1\n";
// 请求资源2
std::condition_variable cv;
std::unique_lock<std::mutex> lock2(mtx2);
while (!resource2) {
std::cout << "Thread A waiting for resource 2...\n";
cv.wait(lock2); // 当资源2可用时唤醒
}
std::cout << "Thread A got resource 2\n";
}
// 线程B
void threadB() {
std::unique_lock<std::mutex> lock(mtx2);
std::cout << "Thread B acquired resource 2\n";
// 请求资源1
std::unique_lock<std::mutex> lock1(mtx1);
while (!resource1) {
std::cout << "Thread B waiting for resource 1...\n";
cv.notify_one(); // 直接唤醒,假设这会导致死锁
}
std::cout << "Thread B got resource 1\n";
}
int main() {
std::thread t1(threadA);
std::thread t2(threadB);
t1.join();
t2.join();
return 0;
}
```
在这个例子中,线程A先获取了资源1然后等待资源2,同时线程B先获取了资源2然后等待资源1。如果线程B直接唤醒线程A而不是等待资源1变为可用,那么就可能导致死锁,因为两个线程都在等待对方释放资源。
阅读全文