死锁问题1
单核实时可抢占的系统中,优先级不同的三个线程A/B/C, A>B>C
- 当C先获得时间片开始执行,并获得锁
- A因为高优先级,被唤醒并中断C,但没有得到锁,而阻塞
- B获得执行机会,由于优先级高于C,B会一直执行,让AC系统无法取得任何进展
std::stack<T> stack;
std::mutex mutex;
void push(const T& obj) {
mutex.lock();
stack.push(obj);
mutex.unlock();
}

死锁问题2
- 多个锁共同控制临界区
- 加锁顺序不一致
- A,B锁被两个线程分别持有,等待对方释放剩下的锁,不会主动释放所持有的锁,而导致死锁
#include <mutex>
#include <iostream>
#include <thread>
using namespace std;
mutex lockA;
mutex lockB;
int counter{0};
void foo() {
while(true) {
lock_guard<mutex> guardA(lockA);
lock_guard<mutex> guardB(lockB);
cout << "message from foo " << counter++ << endl;
}
}
void bar() {
while(true) {
lock_guard<mutex> guardB(lockB); // 注意这里加锁顺序
lock_guard<mutex> guardA(lockA);
cout << "message from bar " << counter++ << endl;
}
}
void DeadLockTest() {
thread tf(foo);
thread tb(bar);
tf.join();
tb.join();
}