首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用pthread_barrier_wait()失败

调用pthread_barrier_wait()失败
EN

Stack Overflow用户
提问于 2021-11-10 18:33:10
回答 1查看 193关注 0票数 0

我在C中有一个多线程应用程序,它对一个矩阵进行一些计算。我用障碍来同步工作。我得到了一堆奇怪的错误和不确定的行为,我意识到我忘记了检查pthread_barrier_wait()的返回值。

在这里,我宣布了一些全球性的障碍:

代码语言:javascript
复制
pthread_barrier_t passa,passb,check;

我有一个主函数,它进行一些初始化,然后生成工作人员:

代码语言:javascript
复制
double **compute (int p, double P, int n, double **a){

    int r1 = pthread_barrier_init(&passa,NULL,p);
    int r2 = pthread_barrier_init(&passb,NULL,p);
    int r3 = pthread_barrier_init(&check,NULL,p);
    if(!(r1==r2==r3==0)){printf("barrier init failed\n"); exit(1);}

    pthread_t *threads = malloc(sizeof(pthread_t)*p);
    //some admin stuff 
    //spawning threads in while loop 
    int err = pthread_create(&threads[i],NULL,&compute0,args);
        if(err){
            printf("Thread Creation Error, exiting..\n");
            exit(1);
        }
        else{ //etc

然后我有了worker线程函数compute0():

代码语言:javascript
复制
void *compute0(void *argsv){
    //stuff
    while(1){
        b = pthread_barrier_wait(&check);
        if(b != PTHREAD_BARRIER_SERIAL_THREAD|| b!= 0){
            printf("b : %d\n",b);
            printf("barrier failed\n"); exit(1);
        }
        //some checks
        b = pthread_barrier_wait(&passa);
        if(b != PTHREAD_BARRIER_SERIAL_THREAD|| b!= 0){
            printf("barrier failed\n"); exit(1);
        }
        //First pass
        // work 
        b = pthread_barrier_wait(&passb);
        if(b != PTHREAD_BARRIER_SERIAL_THREAD || b!= 0){
            printf("barrier failed\n"); exit(1);
        }
        //second pass
        // more work
        }
    }
}

现在我从来没有注意到这一点,但等待的障碍实际上是失败的。以前,我从未检查过它的返回值:

代码语言:javascript
复制
note: one thread is used for control, computations will be run on 2 threads
Thread Created with ID : 139740189513280
Thread Created with ID : 139740181120576
================================================================
b : -1
barrier failed
b : b : 0
make: *** [Makefile:3: all] Error 1

是什么导致了这一切?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-10 19:15:30

你有以下几点:

代码语言:javascript
复制
b != PTHREAD_BARRIER_SERIAL_THREAD || b != 0

它应包括下列任何一项:

代码语言:javascript
复制
!( b == PTHREAD_BARRIER_SERIAL_THREAD || b == 0 )
代码语言:javascript
复制
b != PTHREAD_BARRIER_SERIAL_THREAD && b != 0

所以你可能并没有真正得到一个错误。但是让我们假设,尽管存在上述错误,实际上还是报告了一个错误。只将EINVAL (指示一个糟糕的参数)列为可能的错误。不过,我不指望那是一个完整的清单。您可以使用以下方法进行验证:

代码语言:javascript
复制
errno = b;
perror("pthread_barrier_wait");
exit(1);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69918492

复制
相关文章

相似问题

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