【问题标题】:pthread_barrier_t in looping threads循环线程中的 pthread_barrier_t
【发布时间】:2019-10-27 13:07:22
【问题描述】:

我使用 3 个不同的线程(t0、t1 和 t2),我需要以这种方式同步行为:

我的主线程将创建这 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);
    }

}

在遇到第一个障碍之前它运行良好,但看起来障碍没有重置,我尝试在所有线程遇到它时重新初始化,但效果很奇怪。

【问题讨论】:

  • 你应该展示剩下的代码
  • 我认为您需要 2 个不同的屏障变量(b1、b2)。您还需要使用 pthread_barrier_init 真正初始化它们。
  • 这是我所做的,效果很好。

标签: c multithreading loops pthread-barriers


【解决方案1】:
#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;

}

这会产生想要的输出。

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2015-03-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多