首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环线程中的pthread_barrier_t

循环线程中的pthread_barrier_t
EN

Stack Overflow用户
提问于 2019-10-27 21:07:23
回答 1查看 341关注 0票数 0

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

我的主线程将创建这三个线程,这些线程将循环通过打印和屏障,就像我提到的那样。

我尝试编写传递给它们的函数( t0的f0、t1的f1等):

代码语言:javascript
复制
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);
    }

}

它工作得很好,直到遇到第一个障碍,但看起来障碍没有重置,当所有线程遇到它时,我试图重新初始化它,但它有奇怪的效果。

EN

回答 1

Stack Overflow用户

发布于 2019-10-27 22:30:18

代码语言:javascript
复制
#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;

}

这将产生所需的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58579688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档