我正在学习 pthread 和等待条件。据我所知,典型的等待线程是这样的:
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
我无法理解的是为什么while(!condition)
即使我pthread_cond_signal()
用来唤醒线程也需要这条线。
我可以理解,如果我使用pthread_cond_broadcast()
我需要测试条件,因为我唤醒了所有等待的线程,其中一个线程可以在解锁互斥锁之前再次使条件为假(从而将执行转移到另一个不应该执行的唤醒线程)观点)。但是如果我使用pthread_cond_signal()
我只唤醒一个线程,所以条件必须为真。所以代码可能如下所示:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
我读了一些关于可能发生的虚假信号的文章。这是(而且只有这个)原因吗?为什么我应该有虚假信号?或者还有什么我不明白的?
我假设信号代码是这样的:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);