死锁程序

1 锁顺序死锁

#include <iostream>
#include<pthread>

using namespace std;
pthread_mutex_t left = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t right = PTHREAD_MUTEX_INITIALIZER;

void *leftright(void *arg)
{
	pthread_mutex_lock(left);
	pthread_metux_lock(right);
	cout << "func: leftright()" << endl;
	pthread_mutex_unlock(left);
	pthread_mutex_unlock(right);
}

void *rightleft(void *arg)
{
	pthread_mutex_lock(right);
	pthread_metux_lock(left);
	cout << "func: leftright()" << endl;
	pthread_mutex_unlock(right);
	pthread_mutex_unlock(left);
}

如果进程A和进程B同时分别执行leftright()和rightleft(),可能会发生死锁。
解决方案:如果所有进程以固定的顺序来获得锁, 就不会出现死锁。

2 动态锁顺序死锁

假设有个汇款程序:

//伪代码形式

void *transferMoney(fromAccount, toAccount, mount)
{
	lock(fromAccount);	//锁定汇帐账户
	lock(toAccount);	//锁定来账账户
		dosomething...
	unlock(fromAccount);
	unlock(toAccount);
}
  1. 如果两个线程同时调用transferMoney();
  2. 线程A从X账户向Y账户汇款;transferMoney(X, Y, 100);
  3. 线程B从Y账户向Z账户汇款:transferMoney(Y, Z, 50);
  4. 那么就会发生死锁。

一般使用trylock()来获得锁。trylock()在获取一个资源时,如果该资源已被占用,那么立即返回,不会被阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值