3

如何使用 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。它不像屏障那样起作用。

4

1 回答 1

1

你需要看看这个(PDF),Allen Downey 的 The Little Book of Semaphores。特别是第 3.6.7 节。它在 Python 中,但它的要点应该足够清楚。

于 2013-03-09T09:53:17.743 回答