2009-05-17 11 views
5

私は初期化されたpthread_barrier_tを持っていれば、いつそれを破壊するのが安全ですか?次の例は安全ですか?おならの障壁を破壊するのはいつ安全ですか?

pthread_barrier_t barrier; 
... 
int rc = pthread_barrier_wait(b); 
if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){ 
    perror("pthread_barrier_wait"); 
    exit(1); 
} 

if (id == 0){ 
    if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){ 
    perror("pthread_barrier_destroy"); 
    exit(1); 
    } 
} 

答えて

5

pthread_barrier_wait()が返された後、すべてのスレッドが障壁に当たって進行しています。一つのスレッドだけがPTHREAD_BARRIER_SERIAL_THREAD戻り値が与えられているので、それは条件付きでそのような破壊コードをラップするためにそれを使用しても安全です:

また
int rc = pthread_barrier_wait(&b) 
if (rc == PTHREAD_BARRIER_SERIAL_THREAD) 
{ 
    pthread_barrier_destroy(&b); 
} 

、バリアが使用中であった場合はpthread_barrier_destroy()EBUSYの結果を返すことに注意してください(つまり、別のスレッドがpthread_barrier_wait()を呼び出していました)。

+4

あなたの答えの最終文は偽です。パーPOSIXは、それはUBである:「結果は未定義である任意のスレッドがバリアでブロックされているときpthread_barrier_destroy()が呼び出された場合、またはこの機能が初期化されていないバリアで呼び出された場合。」 (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –

関連する問題