当然可以。这里有两个简单的C++示例来展示死锁的情况。
示例 1:单线程重复申请同一资源
这个例子中,单个线程尝试两次锁定同一个互斥量,导致死锁。
#include <iostream>
#include <mutex>
#include <thread>
std::mutex mtx;
void deadlock_demo() {
mtx.lock();
std::cout << "Locked once." << std::endl;
// 尝试第二次锁定同一个互斥量
mtx.lock();
std::cout << "Locked twice." << std::endl;
mtx.unlock();
}
int main() {
std::thread t(deadlock_demo);
t.join();
return 0;
}
这个程序在尝试第二次锁定同一个互斥量时会产生死锁,因为mtx
已经被锁定,且没有释放。
示例 2:两个线程间的循环等待
这个例子创建两个线程,每个线程尝试锁定两个互斥量,但是以不同的顺序,导致循环等待。
#include <iostream>
#include <mutex>
#include <thread>
std::mutex mtx1, mtx2;
void thread1() {
mtx1.lock();
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 确保线程2获取mtx2
mtx2.lock();
std::cout << "Thread 1 has both locks" << std::endl;
mtx2.unlock();
mtx1.unlock();
}
void thread2() {
mtx2.lock();
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 确保线程1获取mtx1
mtx1.lock();
std::cout << "Thread 2 has both locks" << std::endl;
mtx1.unlock();
mtx2.unlock();
}
int main() {
std::thread t1(thread1);
std::thread t2(thread2);
t1.join();
t2.join();
return 0;
}
在这个例子中,如果thread1
锁定了mtx1
而thread2
锁定了mtx2
,那么它们都会在尝试获取另一个互斥量时等待对方释放锁,从而形成死锁。
这两个例子展示了死锁的典型情况,应当在实际的程序设计中避免这类问题。