死锁
1、死锁定义
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的(Deadlock)。
2、死锁产生的四个必要条件
(1)互斥
(2)不可剥夺
(3)保持且请求
(4)循环等待
3、解决死锁的方法
(1)预防死锁,破坏死锁产生的四个必要条件之一;
(2)避免死锁,银行家算法;
扫描二维码关注公众号,回复:
3695691 查看本文章
(3)检测死锁,资源分配图;
(4)死锁解除;
4、信号量解决互斥问题
#include <iostream>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
class A
{
public:
void inMsgRecQueue()
{
for (int i = 0; i < 100000; i++)
{
mutex1.lock();
mutex2.lock(); //获得两个信号量才能执行
cout << "inMsgRecQueue执行" << endl;
msgRecvQueue.push_back(i);
mutex2.unlock();
mutex1.unlock();
}
}
void outMsgRecvQueue()
{
for (int i = 0; i < 100000; i++)
{
mutex1.lock();
mutex2.lock(); //获得两个信号量才能执行
if (!msgRecvQueue.empty())
{
int command = msgRecvQueue.front();
msgRecvQueue.pop_front();
}
else
{
cout << "outMsgRecvQueue()执行,但是为空" << endl;
}
mutex2.unlock();
mutex1.unlock();
}
}
private:
list<int> msgRecvQueue;
mutex mutex1; //互斥量对象
mutex mutex2;
};
//主线程创建两个线程
int main()
{
A a;
thread myOutThread = thread(&A::outMsgRecvQueue, &a); //创建成员函数线程
thread myInThread = thread(&A::inMsgRecQueue, &a); //创建成员函数线程
myInThread.join();
myOutThread.join();
system("Pause");
return 0;
}
产生两个进程,每个进程需要获得两种资源才能执行,所以必须对两种资源同时进行加锁操作,而且两个进程对两种资源的加锁顺序必须yizh一致才可以。