多个线程但只有一个允许使用方法

时间:2012-10-31 02:46:30

标签: multithreading concurrency race-condition locks condition-variable

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

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

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

1 个答案:

答案 0 :(得分:1)

Barriers是一种有用的同步方法。

在pthreads中,您可以使用两个障碍,每个障碍都初始化为require,但是许多线程正在运行。第一个线程在完成计算后同步,第二个线程在其中一个线程调用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);
}
带有Runnable参数的Java CyclicBarrier可以让你用一个障碍做同样的事情。 (Runnable在所有各方到达之后但在任何一方被释放之前运行。)