发信号通知条件变量(pthreads)

时间:2011-03-03 01:04:03

标签: c pthreads posix mutex condition-variable

假设某些条件变量“cond”与互斥变量“mutex”相关联。如果线程在调用cond后在pthread_cond_wait(&cond,&mutex)上休眠,并且另一个已锁定mutex的线程完成,则该线程在调用{之前或之后调用pthread_cond_signal(&cond)是否重要{1}}?如果调用pthread_mutex_unlock(&mutex),它是否甚至需要解锁互斥锁,因为睡眠线程无论如何都会获取互斥锁?

编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview,“调用pthread_cond_signal()后未能解锁互斥锁可能不允许匹配的pthread_cond_wait()例程完成(它将保持阻塞状态)。”我想那时,解锁,也许只是之后才需要。

2 个答案:

答案 0 :(得分:4)

如果你保持互斥锁被锁定,那么被唤醒的线程无法获取互斥锁,因此将在pthread_cond_wait中阻止等待重新获取互斥锁。

您无需按住互斥锁即可拨打pthread_cond_signal。事实上,如果您的应用程序逻辑可以在互斥锁未锁定时使用信号,那么这是更好的方法 - 操作系统可以立即调度等待线程,而不必等待信号在继续之前解锁互斥锁。

但是,在这种情况下,必须注意确保唤醒不会丢失,并且您没有遇到“错误”线程被唤醒的问题。如果你使用直接谓词,这在实践中应该不是问题。

答案 1 :(得分:3)

您应该在致电pthread_cond_signal后解锁互斥锁。以下是一些很好的问题/答案:

Calling pthread_cond_signal without locking mutex

现在不会来找我,但我很确定(在竞争条件方面)你有一个很好的理由是你不想在发信号之前解锁互斥锁。