【问题标题】:Is pthread_cond_wait completely signal safe?pthread_cond_wait 完全信号安全吗?
【发布时间】:2018-02-05 20:00:50
【问题描述】:
有一段代码在我的堆栈中运行,它等待 pthread_cond_wait。信号被发送到同一进程,但信号处理程序中没有“pthread_cond_signal”代码来通知 pthread_cond_wait,但仍然释放 pthread_cond_wait。还有其他线程通常执行“pthread_cond_wait”来释放等待,但此时它们都没有处于活动状态。
【问题讨论】:
标签:
android
linux
pthreads
signals
【解决方案1】:
pthread_cond_wait 可以通过pthread_cond_signal 或pthread_cond_broadcast 发出信号。
另外,可以使用pthread_cancel 取消pthread,它会向线程发送取消请求。发送取消线程的请求后,您应该检查返回码以确认线程实际上已被取消。
有一个很好的帖子讨论how to kill a pthread。
【讨论】:
-
我的问题不同。我在问它是否不受其他信号(如用户定义的信号)的影响。因为我知道事实上 sem_wait 不是完全信号安全的,所以 checkout linux.die.net/man/3/sem_wait --> 信号处理程序总是会中断对这些函数之一的阻塞调用,无论使用 sigaction(2) SA_RESTART 标志
【解决方案2】:
pthread_cond_wait() 可以在任何时间唤醒,即使它没有被发出信号。
这被称为“虚假唤醒”,正确的代码必须处理它 - 在大多数情况下,调用 pthread_cond_wait() 的正确方法是在如下结构的循环中:
while (!condition_waiting_for)
pthread_cond_wait(&cond, &mutex);
其中condition_waiting_for 是程序共享状态的条件,即您的线程正在等待变为真(例如,“作业队列不为空”)。
当您像这样构建pthread_cond_wait() 调用时,虚假唤醒(包括可能由信号引起的唤醒)不会影响程序的正确性。