2013-09-25 67 views
0

首先,我的问题是不同的。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不解开传递给它的互斥。这个问题的原因是什么?

+1

'pthread_cond_wait'总是解锁互斥量过去了,它这样做原子w.r.t.等待条件变量;当它返回时,它再次自动锁定互斥锁w.r.t.线程再次运行。 'pthread_cond_wait'任一侧的任何代码都将观察处于锁定状态的互斥锁。 –

+0

请显示'pthread_mutex_trylock()'循环代码。该代码可能存在问题。 – jxh

+0

@AdamRosenfield:你说得对。但在特定情况下,我观​​察到了这个问题。 jxh:我在调试器中使用pthread_mutex_trylock,而不是在代码中。 – doptimusprime

回答

0

阅读pthread_setcancelstate后,我发现pthread_cond_wait是线程的取消点。如果对线程启用取消并且延迟,则取消点将测试取消。如果有任何取消挂起,线程将退出。

所以,在我的情况下,线程退出留下mutex_锁定。因此发信号线程块。

但是还有一个疑问。所有线程都是使用Thread类从相同的函数创建的。为什么只有这个线程有这样的取消行为?

1

由于@KenThomases指出:你的问题是,你缺少的信号,而不是信号不获取发送。信号线程在之前调用pthread_cond_signal(),等待线程调用pthread_cond_wait()pthread_cond_wait()只应调用后你测试你正在寻找的不变量当前没有满足:

while (!state_) { 
    result = pthread_cond_wait(&cvar_, &mutex_); 
    if (result == EINVAL) ... // error handling 
} 

其他的东西,有时可以帮助就是把信令线程调用pthread_cond_signal()内关键部分。这是没有必要的,以解决您的问题,但可以使程序更易于推理,因为你知道,没有其他人持有互斥体的时候,你的信号他们:

// signalling thread 
... 
result = pthread_mutex_lock(&mutex_); 
... 
state_ = 1; 
//signals the condition variable. 
pthread_cond_signal(&cvar_); 
result = pthread_mutex_unlock(&mutex_); 
... 
+0

感谢您的回答。在调试时,我发现等待线程在发送线程信号之前正在进入等待状态。后来,我发现实际上等待的线程在pthread_cond_wait()上退出,因此使mutex_锁定。我很快就会发布更多。 – doptimusprime

+0

我加了答案。 – doptimusprime