当前位置: 技术问答>linux和unix
请问怎么防止pthread_mutex_lock锁定一个被另一个线程已经锁定的mutex变量时出现死锁?谢谢
来源: 互联网 发布时间:2016-01-11
本文导语: 想要的结果是阻塞直到另一个线程pthread_mutex_unlock,而不是一直死锁,或者出现为定义的结果。谢谢 | pthread_mutex_lock锁定一个被另一个线程已经锁定的mutex变量时不会出现死锁.. 1.如果互斥...
想要的结果是阻塞直到另一个线程pthread_mutex_unlock,而不是一直死锁,或者出现为定义的结果。谢谢
|
pthread_mutex_lock锁定一个被另一个线程已经锁定的mutex变量时不会出现死锁..
1.如果互斥类型为:快速互斥,加锁线程被阻塞直至拥有互斥的线程解锁为止.
2.如果互斥类型为:检错互斥,加锁线程不被阻塞,立即返回一个出错代码EDEADLK.
3.如果互斥类型为:递归互斥,加锁线程成功返回并且增加调用线程在互斥上加锁的次数.
所以在一个已经加锁的互斥上再加锁,不会出现死锁,不能够成死锁的条件.
1.如果互斥类型为:快速互斥,加锁线程被阻塞直至拥有互斥的线程解锁为止.
2.如果互斥类型为:检错互斥,加锁线程不被阻塞,立即返回一个出错代码EDEADLK.
3.如果互斥类型为:递归互斥,加锁线程成功返回并且增加调用线程在互斥上加锁的次数.
所以在一个已经加锁的互斥上再加锁,不会出现死锁,不能够成死锁的条件.
|
引发死锁的条件:
必须满足以下四种条件
1,互斥条件,每个资源要么已经分配给一个进程,要么就是可用的。
2,占有等待条件,已经得到了某个资源的进程可以再请求新的资源
3,不可抢占条件,已经分配给一个进程的资源不能强制的被抢占,只能被占有他的进程显示的释放
4,环路等待条件,死锁发生时,系统中一定有两个或者两个以上的进程组成一环路,该环路中的每一个
按照楼主的命题,如果按照正确的顺序加锁的话,阻塞。
如果数序不对的话可能会死锁
必须满足以下四种条件
1,互斥条件,每个资源要么已经分配给一个进程,要么就是可用的。
2,占有等待条件,已经得到了某个资源的进程可以再请求新的资源
3,不可抢占条件,已经分配给一个进程的资源不能强制的被抢占,只能被占有他的进程显示的释放
4,环路等待条件,死锁发生时,系统中一定有两个或者两个以上的进程组成一环路,该环路中的每一个
按照楼主的命题,如果按照正确的顺序加锁的话,阻塞。
如果数序不对的话可能会死锁
|
只有当两个线程交叉锁定两个 mutex 然后互相等待时才会出现死锁。楼主的命题不成立。
|
在使用互斥锁的时候加入条件变量的使用。
|
楼上说的错了吧……
|
同意狒狒,楼主的命题不成立。