- 论坛徽章:
- 1
|
按照POSIX规定:
一个默认属性的互斥量被同一个线程pthread_mutex_lock()两次
将发生死锁, 但是这个死锁有时候是编程者所期望的
因此默认情况下, LINUX的死锁导致线程休眠而不是返回EDEADLK
而SOLARIS和FreeBSD默认会返回EDEADLK错误
如果互斥量具有递归锁属性, 那么这个互斥量会带计数器, pthread_mutex_lock()导致这个计数器+1
而pthread_mutex_unlock()使这个计数器-1, 只有使计数器为0时, 线程才能占有这个互斥量,
相应线程才能不被阻塞
不过POSIX说, 一个线程连续调用2次pthread_mutex_lock()被递归锁锁住,
另外一个线程去pthread_mutex_unlock()这个锁, 行为是未定义的
在LINUX 2.6里面, 一个线程重复上锁导致死锁阻塞, 另外一个线程给这个死锁线程解锁是可以的,
默认属性就可以, 用法就象条件变量
按POSIX照规范来讲, 用条件变量实现我要的效果才是对的
不知道条件变量比递归锁消耗资源多多少?
另外一个问题就是, 条件变量所使用的锁是否也是递归锁? |
|