如何使用 posix 信号量实现屏障?
void my_barrier_init(int a){
int i;
bar.number = a;
bar.counter = 0;
bar.arr = (sem_t*) malloc(sizeof(sem_t)*bar.number);
bar.cont = (sem_t*) malloc(sizeof(sem_t)*bar.number);
for(i = 0; i < bar.number; i++){
sem_init(&bar.arr[i], 0, 0);
sem_init(&bar.cont[i], 0, 0); }
}
void my_barrier_wait(){
int i;
bar.counter++;
if(bar.number == bar.counter){
for(i = 0; i < bar.number-1; i++){ sem_wait(&bar.arr[i]); }
for(i = 0; i < bar.number-1; i++){ sem_post(&bar.cont[i]); }
bar.counter = 0;
}else{
sem_post(&bar.arr[pthread_self()-2]);
sem_wait(&bar.cont[pthread_self()-2]);
}
}
当调用函数 my_barrier_wait 时,首先 (N-1) 次它将为数组“arr”中的信号量设置(+1) 并进入睡眠状态(调用 sem_wait)。第 N 次它减少 'arr' 中的信号量并且应该(如我所料)唤醒 [0..bar.number-1] 线程为 'cont' 数组中的信号量发布 +1。它不像屏障那样起作用。