【问题标题】:Can it be assumed that `pthread_cond_signal` will wake the signaled thread atomically with regards to the mutex bond to the condition variable?是否可以假设`pthread_cond_signal` 将在互斥体绑定到条件变量时自动唤醒信号线程?
【发布时间】:2017-10-28 00:28:24
【问题描述】:

Quoting POSIX:

pthread_cond_broadcast()pthread_cond_signal() 函数可由线程调用,无论它当前是否拥有调用 pthread_cond_wait()pthread_cond_timedwait() 的线程在等待期间与条件变量关联的互斥锁;但是,如果需要可预测的调度行为,则该互斥体应由调用pthread_cond_broadcast()pthread_cond_signal() 的线程锁定。

“如果需要可预测的调度行为”。这可能/将暗示在调用 pthread_cond_signal() 之前锁定绑定到条件变量的互斥锁应该保证在任何其他线程设法锁定此互斥锁之前唤醒发出信号的线程。这是正确的吗?

【问题讨论】:

    标签: multithreading pthreads posix mutex condition-variable


    【解决方案1】:

    如果有任何 PThreads 专家有更全面的答案,我们将确定,但据我所知,至少在 Linux 联机帮助页中,您无法获得完全可预测的行为。你得到的是一个保证,如果两个线程在同一个条件变量上等待,优先级更高的线程首先开始(至少,如果一个线程是 SCHED_OTHER 而另一个是实时 SCHED_FIFO,那么在 Linux 上应该是这样的)。如果您在发出信号之前锁定互斥锁(在快速阅读手册页后保留错误),则这种情况成立。

    https://linux.die.net/man/3/pthread_cond_signal

    【讨论】:

    【解决方案2】:

    不,不能保证发出信号的线程会被唤醒。更糟糕的是,如果在信号线程中你有序列:

    while(run_again) {
        pthread_mutex_lock(&mutex);
        /* prepare data */
        pthread_mutex_unlock(&mutex);
        pthread_cond_broadcast(&cond);
    }
    

    由于调度程序中的逻辑,有合理的机会控制永远不会传递给等待mutex 的其他线程。可以在this answer 中找到一些可以玩的示例。

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多