版权声明:如有需要,可供转载,但请注明出处:https://blog.youkuaiyun.com/City_of_skey/article/details/85542643
目录
1、产生死锁条件
死锁产生有四个充分条件:
(1)互斥条件:申请的资源同一时间只能被一个线程占用。
(2)请求和保持条件:一个线程保持了一个资源锁,又去申请另一个资源锁,但这个资源锁被另外一个进程占用了。
(3)不可剥夺条件:线程在占用这个资源锁时不能被系统剥夺。
(4)循环等待条件:一个线程申请资源锁失败后就一直在循环等待。
这个四个条件是产生死锁的充分条件,缺一不可。
2、死锁例子
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
int g_val = 0;
void *fun1(void *argv){
int i = 0;
for(i = 0; i < 10; ++i){
pthread_mutex_lock(&lock1);
sleep(1);
pthread_mutex_lock(&lock2);
g_val += 1;
printf("%s:%d\n", __func__, __LINE__);
pthread_mutex_unlock(&lock2);
pthread_mutex_unlock(&lock1);
}
}
void *fun2(void *argv){
int i = 0;
for(i = 0; i < 10; ++i){
pthread_mutex_lock(&lock2);
sleep(1);
pthread_mutex_lock(&lock1);
printf("%s:%d\n", __func__, __LINE__);
g_val += 1;
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}
}
int main(){
pthread_t t1, t2;
pthread_create(&t1, NULL, fun1, NULL);
pthread_create(&t2, NULL, fun2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&lock1);
pthread_mutex_destroy(&lock2);
printf("g_val:%d\n", g_val);
}
这个例子中线程1占用互斥锁lock1,又要去申请互斥锁lock2,但lock2已经被线程2占用,线程2又去申请互斥锁lock1,这样就进入了循环等待,最终产生死锁。
3、避免死锁
死锁的四个条件只要打破一个条件就能避免死锁
(1)打破请求保持条件
a、注意锁的申请顺序,避免占用了一个锁再去申请另一个被其他进程占用的锁
b、避免在循环中使用锁,这样很容易造成死锁。
(2)打破循环等待条件
打破循环等待条件的方法有两种:
a、使用trylock,如果已经加锁就返回。
b、使用timelock,设定一超时时间,超过这个时间还没有获取锁就返回。