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中指定的数量。
答案 0 :(得分:2)
pthread_cond_wait()
需要锁定的互斥锁。您对pthread_mutex_trylock()
的调用可能会失败,因此在不获取互斥锁的情况下继续。
我建议你改用pthread_mutex_lock()
。
此外,除非您希望重新实施障碍,否则应使用pthread_barrier_init()
和pthread_barrier_wait()
。