pthread_cond_wait信号完全安全吗?



我的堆栈中运行着一段代码,它等待pthread_cond_wait。信号被发送到同一进程,但信号处理程序中没有"pthread_cond_signal"代码来通知pthread_cond_wait但仍会释放pthread_cond_wait。还有其他线程通常执行"pthread_cond_wait"以释放等待,但此时它们都没有处于活动状态。

pthread_cond_wait()

可以随时唤醒,即使它没有发出信号。

这称为"虚假唤醒",正确的代码必须处理此问题 - 在大多数情况下,调用pthread_cond_wait()的正确方法是在循环结构中,如下所示:

while (!condition_waiting_for)
pthread_cond_wait(&cond, &mutex);

其中condition_waiting_for是程序共享状态的条件,即线程正在等待变为 true(例如,"作业队列不为空")。

当您像这样构建pthread_cond_wait()调用时,虚假唤醒(包括可能由信号引起的唤醒)不会影响程序的正确性。

pthread_cond_wait可以通过pthread_cond_signalpthread_cond_broadcast发出信号。

此外,可以使用pthread_cancel取消 pthread,这会向线程发送取消请求。发送取消线程的请求后,您应该检查返回代码以确认线程确实已取消。

有一个很好的线程讨论如何杀死一个线程。

最新更新