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」のセマフォをデクリメントし、(予想どおり)「cont」配列のセマフォに+1をポストする[0..bar.number-1]スレッドを起動する必要があります。バリアのようには機能しません。