2013-05-28 112 views
0
static int barrier_counter = 0; 
pthread_cond_t condition; 

pthread_mutex_t local_lock; 
int init_barrier(int n) { 
    if (n < 0) { 
     return -1; 
    } 
    barrier_counter = n; 
    pthread_mutex_init(&local_lock, NULL); 
    pthread_cond_init(&condition, NULL); 
    return 0; 
} 
int barrier() { 

    pthread_mutex_trylock(&local_lock); 
    barrier_counter--; 
    printf("inside barrier befor the while n is : %d \n",barrier_counter); 
    while (0 < barrier_counter) { 
     printf("inside the barrier n is : %d\n", barrier_counter); 
     pthread_cond_wait(&condition,&local_lock); 
    } 
    printf("befor bordcast : %d \n",barrier_counter); 
    pthread_cond_broadcast(&condition); 
    printf("done the brodcast when n is : %d \n",barrier_counter); 
    pthread_mutex_unlock(&local_lock); 
    return 0; 
} 

我們試圖實施障礙,但不知何故我們沒有做廣播,我們完成任何。 我們甚至不會死鎖,有幾個線程實際上正在等待,但不是我們在init_barrier中指定的數量。實施障礙問題

+3

不要在這裏使用trylock,它可能會失敗,這將使你的'pthread_cond_wait'可能無法按預期工作。另外,爲什麼不使用pthread的障礙? – Hasturkun

+0

@artlessnoise,這不是關於記憶障礙。 –

+0

@JonathanWakely Thx。刪除* linux-kernel *標記可能是有道理的。 –

回答