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);
}
- 如果两个线程同时调用transferMoney();
- 线程A从X账户向Y账户汇款;transferMoney(X, Y, 100);
- 线程B从Y账户向Z账户汇款:transferMoney(Y, Z, 50);
- 那么就会发生死锁。
一般使用trylock()来获得锁。trylock()在获取一个资源时,如果该资源已被占用,那么立即返回,不会被阻塞。