C++多线程(3)-死锁

认识死锁

我自己在实际中碰到的死锁比较少,因为大多数时候,并没有用到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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值