如何使用posix信号量实现屏障?

时间:2012-12-22 18:49:40

标签: multithreading posix semaphore barrier

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

1 个答案:

答案 0 :(得分:1)

你需要看一下艾伦唐尼的this(PDF),小信息书。特别是第3.6.7节。它是在Python中,但它的要点应该足够清楚。