是否可以假设`pthread_cond_signal`将关于互斥键与条件变量原子地唤醒信号线程?

时间:2017-05-27 04:27:27

标签: multithreading pthreads posix mutex condition-variable

Quoting POSIX

  

线程可以调用library(data.table) setDT(df)[, Percentage := paste0(round(100*Student_Count/sum(Student_Count), 2), "%"), by = University] pthread_cond_broadcast()函数,无论它是否当前拥有调用pthread_cond_signal()pthread_cond_wait()的线程与条件变量关联的互斥锁在等待期间;但是,如果需要可预测的调度行为,则该互斥锁应由调用pthread_cond_timedwait()pthread_cond_broadcast()的线程锁定。

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

2 个答案:

答案 0 :(得分:0)

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

请参阅 https://linux.die.net/man/3/pthread_cond_signal

答案 1 :(得分:0)

不,无法保证信号通知线程会被唤醒。更糟糕的是,如果在信令线程中你有序列:

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

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