所以基本上我所处的情况是我有一堆线程,每个线程在一周内都在做不同的计算。在一周结束时,每个线程调用函数 X() 然后开始计算下一周并重复此循环。
但是,只允许一个线程实际执行方法 X() 中的操作,并且只有当所有线程都到达方法 X() 时。此外,在使用方法 X() 的一个线程完成之前,没有一个线程可以继续前进。
所以我很难实现这一点。我觉得我需要使用条件变量,但我仍然对线程和诸如此类的东西感到不安。
所以基本上我所处的情况是我有一堆线程,每个线程在一周内都在做不同的计算。在一周结束时,每个线程调用函数 X() 然后开始计算下一周并重复此循环。
但是,只允许一个线程实际执行方法 X() 中的操作,并且只有当所有线程都到达方法 X() 时。此外,在使用方法 X() 的一个线程完成之前,没有一个线程可以继续前进。
所以我很难实现这一点。我觉得我需要使用条件变量,但我仍然对线程和诸如此类的东西感到不安。
屏障在这里是一种有用的同步方法。
在 pthreads 中,您可以使用两个屏障,每个屏障都初始化为一个要求,但有多少线程正在运行。第一个在线程完成计算后同步线程,第二个在其中一个调用X()
. 方便的是,pthread_barrier_wait将选择 N 个等待线程中的一个且只有一个来实际调用X()
:
void *my_thread(void *whatever) { // XXX error checking omitted
while (1) {
int rc;
do_intense_calculations();
// Wait for all calculations to finish
rc = pthread_barrier_wait(&calc_barrier);
// Am I nominated to run X() ?
if (rc == PTHREAD_BARRIER_SERIAL_THREAD) X();
// Wait for everyone, including whoever is doing X()
rc = pthread_barrier_wait(&x_barrier);
}
Java 的带有 Runnable 参数的CyclicBarrier可以让你用一个屏障做同样的事情。(Runnable 在所有各方到达之后但在任何一方被释放之前运行。)