首先,您必须将谓词更改为
if ( msq.empty() ) {
// no messages so wait for one.
pthread_cond_wait( &cnd, &lock );
}
to
while ( msq.empty() ) {
// no messages so wait for one.
pthread_cond_wait( &cnd, &lock );
}
这是 pthreads 的事情,你必须警惕虚假唤醒 http://vladimir_prus.blogspot.com/2005/07/spurious-wakeups.html.
现在您可以将其更改为
while ( msq.empty() && !finished) {
// no messages so wait for one.
pthread_cond_wait( &cnd, &lock );
}
因为在检查之后,您已经测试是否设置完成并退出(如果设置),
您所要做的就是向所有线程发出信号。
因此,在您的拆卸函数中,将循环替换为:
pthread_cond_broadcast(&cond);
这应该确保所有线程都被唤醒,并且会看到finished
set to true
并退出。
即使您的线程没有卡在中,这也是安全的pthread_cond_wait
。如果线程正在处理消息,它们将不会收到唤醒信号,但是它们将完成该处理,再次进入循环并看到finished == false
并退出。
另一种常见的模式是注入有害消息。有害消息只是您的线程可以识别的特殊消息,这意味着“停止”,您可以将与线程数量一样多的这些消息放入队列中。