【问题标题】: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_signalpthread_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() 调用时,虚假唤醒(包括可能由信号引起的唤醒)不会影响程序的正确性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 2019-12-14
      • 2015-11-27
      • 1970-01-01
      • 2021-08-21
      • 2021-11-21
      • 2011-09-29
      • 2010-09-09
      相关资源
      最近更新 更多