首先,我的问题是不同的。pthread_cond_wait不解锁互斥锁
我的方案中,有一个等待的线程,等待条件变量。信令线程信号条件变量。
我的代码是
//Wating thread
//Lock the mutex_
//mutex_ is of pthread_mutex_t and is initialized.
result = pthread_mutex_lock(&mutex_);
assert(result == 0);
do {
//Wait on condition variable cvar_
//cva_ is of pthread_cond_t and is initialized.
result = pthread_cond_wait(&cvar_, &mutex_); //POINT 1
}while(result == 0 && !state_);
//Unlock the mutex_.
result = pthread_mutex_unlock(&mutex_);
//signalling thread
result = pthread_mutex_lock(&mutex_); //POINT 2
assert(result == 0);
state_ = 1;
result = pthread_mutex_unlock(&mutex_);
assert(result == 0);
//signals the condition variable.
pthread_cond_signal(&cvar_);
我的操作系统为Mac OS X 10.8,但最低目标是10.6
这是没有任何问题几乎在每一个案件,但一个运行良好。
在特定情况下,我注意到在POINT 1为pthread_cond_wait
之后,当进入等待状态时,mutex_未解锁。这个我通过pthread_mutex_trylock
确认,在这种情况下返回EBUSY。由于这一点,信号线程等待并最终导致死锁。
我想什么条件下才知道,pthread_cond_wait
不解开传递给它的互斥。这个问题的原因是什么?
'pthread_cond_wait'总是解锁互斥量过去了,它这样做原子w.r.t.等待条件变量;当它返回时,它再次自动锁定互斥锁w.r.t.线程再次运行。 'pthread_cond_wait'任一侧的任何代码都将观察处于锁定状态的互斥锁。 –
请显示'pthread_mutex_trylock()'循环代码。该代码可能存在问题。 – jxh
@AdamRosenfield:你说得对。但在特定情况下,我观察到了这个问题。 jxh:我在调试器中使用pthread_mutex_trylock,而不是在代码中。 – doptimusprime