多线程死锁

本文通过两个函数add1和add2的实例,展示了如何在多线程环境下因加锁顺序不当而导致死锁的问题,并提供了避免死锁的方法。


/*
	死锁:二个线程同时锁住一个变量时。
	锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。
*/
/*	注意死锁是因为二个函数的加锁与解锁的顺序有关...如下面的代码:
	函数add1:
		g_mutex1.lock();
		(*a)++;
		g_mutex2.lock();
		(*b)++;
		g_mutex1.unlock();
		g_mutex2.unlock();
	函数add2:
		g_mutex2.lock();	//加锁
		g_mutex1.lock();
		(*a)++;
		g_mutex1.unlock();
		(*b)++;
		g_mutex2.unlock();
*/
#include<iostream>
#include<thread>
#include<mutex>
#include<Windows.h>

using namespace std;
//trhead:引用类型一般用在函数,而 thread 是模板,避免类型转换,尽量使用指针。
#define COUNT 100000
mutex g_mutex1, g_mutex2;	//互斥量

void add1(int *a,int *b)
{
	for (int i = 0; i < COUNT; i++)
	{
		/* 死锁的情况 于下面的add2函数合用。
		g_mutex1.lock();
		(*a)++;
		g_mutex2.lock();
		(*b)++;
		g_mutex1.unlock();
		g_mutex2.unlock();*/

		g_mutex1.lock();
		(*a)++;			//注意这儿锁的变量顺序。
		g_mutex1.unlock();
		g_mutex2.lock();
		(*b)++;		
		g_mutex2.unlock();
		//Sleep(3000);
	}
}

void add2(int *a, int *b)
{
	
	for (int i = 0; i < COUNT; i++)
	{
		//g_mutex2.lock();	//加锁
		//g_mutex1.lock();
		//(*a)++;
		//g_mutex1.unlock();
		//(*b)++;
		//g_mutex2.unlock();
	
		g_mutex2.lock();	//加锁		
		(*b)++;		
		g_mutex2.unlock();
		g_mutex1.lock();
		(*a)++;
		g_mutex1.unlock();
				
		//Sleep(3000);
	}
}

void main()
{
	int a = 0;
	int b = 0;

	thread th1(add1, &a, &b);
	thread th2(add2, &a, &b);
	th1.join();
	th2.join();

	while (1)
	{
		cout <<"a:"<< a << endl;
		cout <<"b:"<< b << endl;
		this_thread::sleep_for(chrono::seconds(3));
	}

	cin.get();
}


HLC-723G8全自动糖化血红蛋白分析仪的中文使用说明书。第 1 章、前言1、 1 概要……………………………….…………………………………………………………P1-1第 2 章、使用之前须知2、 1 零部件的检查…………………………………………………………….…………………P2-22、 2 仪器的构成………………………………………………………………………………….P2-52、 3 各部分的名称和作用………….……………………………………………………………P2-72、 4 设置地点…………….…….…………………………………….…………………………P2-132、 5 连接………………..….……………………………………………………………………P2-182、 6 柱………...…………………………………………………………………………………P2-23第 3 章、测定操作3、 1 测定的原理…………………………………………………………….…………………P3-13、 2 接通电源……………………………………………………………………………………P3-23、 3 测定的流程………………………………………………………………….………………P3-83、 4 了解仪器的工作状态………………………………………………………...……………P3-103、 5 测定前的确认事项………..……………………………………………….………………P3-163、 6 校准………………………………………………………………………………………P3-213、 7 试样………………………………………………………………………………………P3-293、 8 测定的开始和结束………………………………………………………………………P3-393、 9 消除错误…………………………………………………………………………………P3-423、 10 紧急试样的测定(STAT) ……………………………………………………………... P3-443、 11 利用 POWER 键关闭电源操作…………………………………..……………………P3-473、 12 测定结果的看法…………………………………………………………………..……P3-483、 13 清单数据…………………………………………………………..……………………P-3-55第 4 章、画面操作4、 1 主画面……………………………………………………………………………… P4-14、 2 STAT………………………………………………………………………………P4-44、 3 维护………………………………………………………………………………… P4-64 、 4 试 剂 更 换 … … … … … … … … … … … … … … … … … … … … … … … . P 4 - 74、 5 菜单………………………………………………………………………………… P4-84、 6 参数设定…………………………………………………………………………P4-94、 7 存储卡……………………………………………………………………………… P4-184、 8 保存数据的一览表………………………………………………………………P4-214、 9 被保存的测定结果的确认、重算、向主机再次传送……………………… P4-234、 10 日期、时间的设定和一周定时的设定………………………………………….. P4-25I4、 11 清单数据显示和条形码的编辑…………………………………………………... P4-274、 12 应用程序………………………………………………………………………P4-294、 13 数据通信的设定………………………………..……………………………………P4-304、 14 密码输入(参数初始化) …………………………………………………………P4-324、 15 参数的打印……………………………………………………………………P4-334、 16 注解行的设定…………………………………………………………………P4-344、 17 记录文件的确认………………………………………………………………P4-354、 18 结果判定参数的设定…………………………………………………………..P4-374、 19 条型码读取器的设定和读取检查………………………..……………………….P4-42第 5 章、日常的维护保养管理5、 1 每天的保养和管理………………………………………………………………P5-15、 2 维护保养检查项目………………………………………………………………P5-25、 3 洗脱液、溶血清洗液的更换……………………………………………………P5-45、 4 洗脱液的注入……………………………………………………………………P5-85、 5 泵的排气…………………………………………………………………………P5-105、 6 柱的更换…………………………………………………………………………P5-135、 7 过滤器的更换……………………………………………………………………P5-165、 8 打印纸的更换……………………………………………………………………P5-195、 9 吸管过滤器的更换………………………………………………………………P5-215、 10 采样针的更换………………………………………………………………… P5-225、 11 针清洗部件 O 型环的更换…………………………………………………….P5-25第 6 章、故障检修6、 1 在测定中的注意事项……………………………………………………………..P6-16、 2 故障时要确认的事项………………………………………………………………….P6-36、 3 错误信息……………………………………………………………………….…..P6-66、 4 异常色谱………………………………………………………………………P6-22第 7 章、附录7、 1 从软盘读取文件…………………..………………………………………………….P7-17、 2 与主计算机之间的通信………………………………………………………………… P7-6.7、 3 主机的设计规格…………………………………………………………….………… P7-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值