1、死锁现象
void thread1_func(void)
{
pthread_mutex_lock(mutex1); //获取互斥锁1
pthread_mutex_lock(mutex2); //获取互斥锁2,阻塞
}
void thread2_func(void)
{
pthread_mutex_lock(mutex2); //获取互斥锁2
pthread_mutex_lock(mutex1); //获取互斥锁1,阻塞
}
当线程1获取了互斥锁1,线程2获取了互斥锁2,接下来线程1想要获取互斥锁2时会发生阻塞,同理线程2获取互斥锁1时发生阻塞,此时就产生了死锁。
2、解决死锁方法1
void thread1_func(void)
{
pthread_mutex_lock(mutex1); //获取互斥锁1
pthread_mutex_lock(mutex2); //获取互斥锁
}
void thread2_func(void)
{
pthread_mutex_lock(mutex1); //获取互斥锁1
pthread_mutex_lock(mutex2); //获取互斥锁2
}
不同进程按照相同的顺序去获取互斥锁,即可避免死锁现象。
3、解决死锁方法2
一个线程获取了第一个互斥锁后,之后获取互斥锁都采用不阻塞的方式去获取,如果获取失败,则解开已经获取到的锁,然后继续新一轮的尝试。
void thread1_func(void)
{
int ret = -1;
do_again:
pthread_mutex_lock(mutex1); //获取互斥锁1
....
ret = pthread_mutex_trylock(mutex2); //尝试获取互斥锁2
if(ret != 0){ //获取互斥锁2失败
pthread_mutex_unlock(mutex1); //解锁互斥锁1
goto do_again;
}
....
}