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

4

1 に答える 1

1

あなたはこれ(PDF)、アレン・ダウニーによるセマフォの小さな本を見る必要があります。具体的にはセクション3.6.7。Pythonですが、その要点は十分に明確である必要があります。

于 2013-03-09T09:53:17.743 に答える