首先,我的问题是不同的。
在我的场景中,有一个等待线程,它等待条件变量。信号线程信号条件变量。
我的代码是
//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
不会解锁传递给它的互斥锁。这个问题的原因是什么?