0

所以基本上我所处的情况是我有一堆线程,每个线程在一周内都在做不同的计算。在一周结束时,每个线程调用函数 X() 然后开始计算下一周并重复此循环。

但是,只允许一个线程实际执行方法 X() 中的操作,并且只有当所有线程都到达方法 X() 时。此外,在使用方法 X() 的一个线程完成之前,没有一个线程可以继续前进。

所以我很难实现这一点。我觉得我需要使用条件变量,但我仍然对线程和诸如此类的东西感到不安。

4

1 回答 1

1

屏障在这里是一种有用的同步方法。

在 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 在所有各方到达之后但在任何一方被释放之前运行。)

于 2012-10-31T05:11:01.250 回答