pthread_barrier_t в зацикливании потоков - PullRequest
0 голосов
/ 27 октября 2019

Я работаю с 3 различными потоками (t0, t1 и t2), которым мне нужно синхронизировать поведение следующим образом:

c

Мой основной потокбудет создавать эти 3 потока, и они будут проходить через отпечатки и барьер, как я уже упоминал.

Я пытался написать функции, которые я им передаю (f0 для t0, f1 для t1 и т. д.):

pthread_barrier_t b; //in my main I initialize pthread_barrier_init(&b, NULL, 3);

void *f0(void *arg){

    while(1){
        printf("A\n");
        pthread_barrier_wait(&b);
        pthread_barrier_wait(&b);
        printf("D\n");
    }

}

void *f1(void *arg){

    while(1){
        pthread_barrier_wait(&b);
        printf("B\n");
        pthread_barrier_wait(&b);
    }

}

void *f2(void *arg){

    while(1){
        pthread_barrier_wait(&b);
        printf("C\n");
        pthread_barrier_wait(&b);
    }

}

Это работало хорошо, пока первый барьер не был преодолен, но казалось, что барьер не сбрасывается, я попытался повторно инициировать его, как только все потоки натолкнулись на него, но у него были странные эффекты.

1 Ответ

0 голосов
/ 27 октября 2019
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

pthread_barrier_t b[2];

pthread_t t[3];

void *f0(void *arg){

    while(1){
        printf("A");
        pthread_barrier_wait(&b[0]);
        pthread_barrier_wait(&b[1]);
        printf("B\n");
        sleep(1);
    }

}

void *f1(void *arg){

    while(1){
        pthread_barrier_wait(&b[0]);
        printf("C");
        pthread_barrier_wait(&b[1]);
    }

}

void *f2(void *arg){

    while(1){
        pthread_barrier_wait(&b[0]);
        printf("D");
        pthread_barrier_wait(&b[1]);
    }

}

void *(*f[3])(void*) = {&f0, &f1, &f2};

int main(){

    for(int barrier = 0; barrier < 2; barrier++){
        if(pthread_barrier_init(&b[barrier], NULL, 3) != 0){
            perror("pthread_barrier_init");
            return 1;
        }
    }

    for(int thread = 0; thread < 3; thread++){
        if(pthread_create(&t[thread], NULL, f[thread], NULL) != 0){
            perror("pthread_create");
            return 2;
        }
    }

    for(int thread = 0; thread < 3; thread++){
        if(pthread_join(t[thread], NULL) != 0){
            perror("pthread_join");
            return 3;
        }
    }

    return 0;

}

Это дает желаемый результат.

...