线程可以调用
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()
之前锁定绑定到条件变量的互斥锁应该保证在任何其他线程设法锁定此互斥锁之前唤醒信号通知的线程。这是对的吗?
答案 0 :(得分:0)
如果任何PThreads专家有更全面的答案,我们将会这样做,但据我所知,至少在Linux手册页中,你没有得到完全可预测的行为。你得到的是保证如果两个线程在相同的条件变量上等待,那么更高的prio线程会先行(至少,如果一个线程是SCHED_OTHER而另一个是实时的SCHED_FIFO,那么在Linux上应该是真的)。如果您在发出信号之前锁定互斥锁(在快速阅读联机帮助页后保留错误),则会成立。
答案 1 :(得分:0)
不,无法保证信号通知线程会被唤醒。更糟糕的是,如果在信令线程中你有序列:
while(run_again) {
pthread_mutex_lock(&mutex);
/* prepare data */
pthread_mutex_unlock(&mutex);
pthread_cond_broadcast(&cond);
}
由于调度程序中的逻辑,有合理的机会控制永远不会传递给等待mutex
的其他线程。您可以在this answer找到一些与您一起玩的示例。