- 互斥条件
死锁的发生一定是在对临界资源的访问上,即同一时刻资源只能由一个进程访问。
- 持有且保持条件
进程占有一个资源同时请求另一资源,在未获取另一资源的情况下并不释放原有资源。
- 不可抢占条件
低优先级进程占有的资源在自由释放前,不可被其他进程抢占。
- 环路等待条件
发生死锁时必定会有一条进程-资源环形等待链,即存在进程p0、p1、、、、pn,p0在等待p1释放资源,p1在等待p2释放资源,、、、、,pn在等待p0释放资源。
所以我们可以从破坏以上4个条件的成立来防止死锁的发生。
- 死锁伪代码
1、连续对同一个互斥量两次加锁
thread_fun(){ pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); pthread_mutex_unlock(&mutex): }
2、线程A对互斥量一加锁同时等待互斥量二解锁,线程B对互斥量二加锁同时等待互斥量一解锁
thread_fun1(){ pthread_mutex_lock(&mutex1); pthread_mutex_lock(&mutex2); pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); } thread_fun2(){ pthread_mutex_lock(&mutex2); pthread_mutex_lock(&mutex1); pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); }