gpt4 book ai didi

c++ - pthread_cond_wait 不解锁互斥量

转载 作者:行者123 更新时间:2023-11-28 07:24:19 27 4
gpt4 key购买 nike

首先,我的问题是不同的。

在我的场景中,有一个等待线程,它等待条件变量。信号线程信号条件变量。

我的代码是

//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
除了一种情况外,几乎在所有情况下都运行良好,没有任何问题。

在特定情况下,我注意到在第 1 点之后,即 pthread_cond_wait,mutex_ 在进入等待状态时未解锁。我通过 pthread_mutex_trylock 确认了这一点,在这种情况下它返回 EBUSY。因此,信号线程进入等待状态并最终导致死锁。

我想知道在什么情况下,pthread_cond_wait 不会解锁传递给它的互斥体。这个问题的原因是什么?

最佳答案

正如@KenThomases 所指出的:您的问题是您错过了信号,而不是信号没有被发送。信号线程在等待线程调用 pthread_cond_wait() 之前调用 pthread_cond_signal()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_);
...

关于c++ - pthread_cond_wait 不解锁互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996271/

27 4 0