认识死锁
我自己在实际中碰到的死锁比较少,因为大多数时候,并没有用到2个以上的锁。先来看看死锁吧,主要是多个进程之间对资源进行竞争导致的一种僵持状态。线程就是精华版的进程了。
死锁产生的四个条件
自己在不经意之间产生的死锁,其实也是有着一些总结的规律:
1,互斥资源:进程要求分配的资源进行排他性控制,即在一段时间内某资源仅为一进程所占用;(这里就相当于对资源加上互斥锁)
2,资源不可强占:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放;(这里相当于线程1无法打开线程2的锁)
3,占有且等待:当进程因请求资源而阻塞时,对已获得的资源保持不放;(这个好理解,锁了资源后,就会一直保持)
4,循环并等待:在发生死锁时,必然存在一个进程–资源的环形链;(这里我觉得不太好理解,但是可以想到的是,死锁必须形成一种线程1等待线程2的释放,而线程2又在等待线程1的释放资源)
手写死锁
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int data = 1;
mutex mt1,mt2;
#include <Windows.h>
void a2()
{
for(int i =0;i<10000;i++)
{
mt2.lock();
Sleep(1);
data = data*data;
mt1.lock();
cout<<data<<endl;
mt1.unlock();
mt2.unlock();
}
}
void a1()
{
for(int i =0;i<10000;i++)
{
mt1.lock();
Sleep(1);
data ++;
mt2.lock();
cout<<data<<endl;
mt2.unlock();
mt1.unlock();
}
}
int main()
{
thread t1(a1);
thread t2(a2);
t1.join();
t2.join();
cout<<"thisis main thread"<<endl;
system("pause");
return 0;
}