0

我想知道while等待线程被唤醒后会发生什么。

为了避免“虚假唤醒”,pthreads文档指出您需要pthread_cond_waitwhile语句中使用。

因此,当pthread_cond_wait调用 时,调用线程被阻塞。发出信号后,线程在while.

在我的代码中,我正在处理pthread_cond_wait()这种方式:

pthread_mutex_lock(&waiting_call_lock);
while(1) {
    pthread_cond_wait(&queue_cond[thread_ctx], &waiting_call_lock);
    break;
}
pthread_mutex_unlock(&waiting_call_lock);

问题是,它会尝试再次进入一段时间,还是以某种方式进入一段break时间并继续?或者,在那种情况下,break之后pthread_cond_wait()是必要的?

4

1 回答 1

2

为了做到这一点,我认为最好先问自己:“线程在等待什么?”

答案不应该是“它应该等到另一个线程发出信号”,因为条件变量的工作方式是假设你有其他东西,某种受互斥保护的信息,线程要等待。

为了说明这一点,我将在这里发明一个示例,其中线程应该等待直到调用的变量counter大于 7。该变量counter可由多个线程访问,并受我将调用的互斥锁保护theMutex。那么涉及pthread_cond_wait调用的代码可能如下所示:

pthread_mutex_lock(&theMutex);
while(counter <= 7) {
    pthread_cond_wait(&cond, &theMutex);
}
pthread_mutex_unlock(&theMutex);

现在,如果发生“虚假唤醒”,程序会(counter <= 7)再次检查条件,发现仍然不满足,所以它会停留在循环中并pthread_cond_wait再次调用。因此,这确保了在满足条件之前,线程不会继续通过 while 循环。

由于虚假唤醒在实践中很少发生,因此触发它以检查您的实现是否正常工作可能是有意义的;这里有一个讨论:如何在 Linux 应用程序中触发虚假唤醒?

于 2019-05-12T06:38:56.900 回答