【发布时间】:2021-12-23 08:38:37
【问题描述】:
我有一个 C 语言的多线程应用程序,它对矩阵进行一些计算。我使用障碍来同步工作。我遇到了一堆奇怪的错误和不确定的行为,我意识到我忘了检查 pthread_barrier_wait() 的返回值。
我在这里声明一些全球性的障碍:
pthread_barrier_t passa,passb,check;
我有一个 main 函数,它进行一些初始化,然后产生工人:
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
然后我有工作线程函数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
这可能是什么原因造成的?
【问题讨论】:
-
r1==r2==r3==0可能没有按照您的预期进行
标签: c multithreading pthreads barrier