我的堆栈中有一段代码在pthread_cond_wait上等待。信号发送到同一进程,但信号处理程序中没有“pthread_cond_signal”代码通知pthread_cond_wait,但仍释放pthread_cond_wait。还有其他线程通常会执行“pthread_cond_wait”来释放等待,但此时它们都没有活动。
答案 0 :(得分:1)
pthread_cond_wait()
可以随时唤醒,即使它尚未发出信号。
这被称为"虚假唤醒",正确的代码必须处理这个 - 在大多数情况下,调用pthread_cond_wait()
的正确方法是在一个循环结构中,如下所示:
while (!condition_waiting_for)
pthread_cond_wait(&cond, &mutex);
其中condition_waiting_for
是您的程序共享状态的条件,即您的线程正在等待变为真(例如,"作业队列不为空")。
当您构建pthread_cond_wait()
这样的呼叫时,虚假唤醒 - 包括可能由信号引起的唤醒 - 不会影响程序的正确性。
答案 1 :(得分:0)
pthread_cond_wait
可以pthread_cond_signal
或pthread_cond_broadcast
发出信号。
此外,可以使用pthread_cancel
取消pthread,{{1}}向线程发送取消请求。在发送取消线程的请求后,您应检查返回代码以确认该线程实际已被取消。
有一个讨论how to kill a pthread的好主题。