我正在学习pthread和等待条件。至于我可以告诉一个典型的等待线程是这样的: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);
我读了一些关于可能发生的虚假信号。这(并且仅此)是原因吗?为什么我应该有虚假singnals?或者还有别的东西我没有得到?
我假设的信号代码是这样的:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
我明白了,所以由于逻辑原因(无尽的等待)需要“if”,但由于实现问题(虚假信号),实际需要一段时间。 – Emiliano 2009-07-16 11:40:24
是的,当我第一次使用pthreads库时,我问了同样的问题。我省略了检查状态变量,并且在等待发生之前我的程序会发出信号。这是等待/信号功能的全部要点。等待并发出一些互斥保护的内存状态变化信号。 – 2011-03-25 15:09:46