多线程死锁

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/*
	死锁:二个线程同时锁住一个变量时。
	锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。
*/
/*	注意死锁是因为二个函数的加锁与解锁的顺序有关...如下面的代码:
	函数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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值