我在C中有一个多线程应用程序,它对一个矩阵进行一些计算。我用障碍来同步工作。我得到了一堆奇怪的错误和不确定的行为,我意识到我忘记了检查pthread_barrier_wait()的返回值。
在这里,我宣布了一些全球性的障碍:
pthread_barrier_t passa,passb,check;我有一个主函数,它进行一些初始化,然后生成工作人员:
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():
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
}
}
}现在我从来没有注意到这一点,但等待的障碍实际上是失败的。以前,我从未检查过它的返回值:
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是什么导致了这一切?
发布于 2021-11-10 19:15:30
你有以下几点:
b != PTHREAD_BARRIER_SERIAL_THREAD || b != 0它应包括下列任何一项:
!( b == PTHREAD_BARRIER_SERIAL_THREAD || b == 0 )b != PTHREAD_BARRIER_SERIAL_THREAD && b != 0所以你可能并没有真正得到一个错误。但是让我们假设,尽管存在上述错误,实际上还是报告了一个错误。这只将EINVAL (指示一个糟糕的参数)列为可能的错误。不过,我不指望那是一个完整的清单。您可以使用以下方法进行验证:
errno = b;
perror("pthread_barrier_wait");
exit(1);https://stackoverflow.com/questions/69918492
复制相似问题