【发布时间】:2010-11-11 07:18:20
【问题描述】:
我正在学习 pthread 和等待条件。据我所知,一个典型的等待线程是这样的:
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
我无法理解的是为什么即使我使用pthread_cond_signal() 来唤醒线程,while(!condition) 行也是必要的。
我可以理解,如果我使用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);
【问题讨论】:
标签: c multithreading pthreads