Как заставить несколько потоков POSIX ждать начала другого - PullRequest
0 голосов
/ 02 ноября 2018

Я работаю над программой, которая использует многопоточность для симуляции людей и лифта. Есть один лифт и несколько человек, которые едут на лифте.

Пока что я пытаюсь создать один поток на человека и один поток для лифта. Однако людям нужно подождать, пока лифт будет создан, прежде чем они смогут приступить к выполнению своих действий, а лифту нужно подождать, пока все люди будут созданы, прежде чем он начнет двигаться.

Я посмотрел в pthread_join (), но похоже, что он ждет, когда поток завершит работу, а это не то, чего я хочу.

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете использовать барьеры.

Из раздела Барьеры pthread руководства по pthread от randu.org :

pthreads может участвовать в барьере для синхронизации с некоторым моментом времени. Барьерные объекты инициализируются как взаимные исключения или условные переменные, за исключением одного дополнительного параметра count. Переменная count определяет число потоков, которые должны присоединиться к барьеру, чтобы барьер достиг завершения и разблокировать все потоки, ожидающие на барьере.

Другими словами, вы можете создать барьер с помощью n, и все потоки, которые вызывают pthread_barrier_wait, будут ждать, пока не будут сделаны n вызовы pthread_barrier_wait.

Ниже приведен простой пример, в котором все три потока будут печатать «До», прежде чем любые потоки будут печатать «После».

#include <pthread.h>
#include <stdio.h>

pthread_barrier_t barrier; 

void* foo(void* msg) {
    printf("%s: before\n", (char*)msg);

    // No thread will move on until all three threads have reached this point
    pthread_barrier_wait(&barrier);

    printf("%s: after\n", (char*)msg);
}

int main() {

    // Declare three threads
    int count = 3;
    pthread_t person_A, person_B, elevator;

    // Create a barrier that waits for three threads
    pthread_barrier_init(&barrier, NULL, count); 

    // Create three threads
    pthread_create(&person_A, NULL, foo, "personA");
    pthread_create(&person_B, NULL, foo, "personB");
    pthread_create(&elevator, NULL, foo, "elevator");

    pthread_join(person_A, NULL);
    pthread_join(person_B, NULL);
    pthread_join(elevator, NULL);
    printf("end\n");
}

Запустите код здесь

...