Несколько потоков, но только один разрешено использовать метод

Таким образом, в основном я нахожусь в ситуации, когда у меня есть куча потоков, каждый из которых выполняет разные вычисления в течение недели. В конце недели каждый поток вызывает функцию X(), а затем начинает вычисления для следующей недели и повторяет этот цикл.

Однако только одному потоку разрешено фактически выполнять операции в методе X() и только когда все потоки достигли метода X(). Кроме того, ни один из потоков не может продолжать свой путь до тех пор, пока не завершится один поток, который должен использовать метод X().

Так что я испытываю трудности в реализации этого. Я чувствую, что мне нужно использовать условную переменную, но я все еще шокирован потоками и так далее.

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 CyclicBarrier с аргументом Runnable позволит вам сделать то же самое с одним барьером. (Runnable запускается после того, как прибывают все стороны, но до того, как они будут освобождены.)

Другие вопросы по тегам