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中指定的数量。

最佳答案

pthread_cond_wait()需要锁定的互斥锁。您对pthread_mutex_trylock()的调用可能会失败,因此在不获取互斥量的情况下继续。
我建议你改用pthread_mutex_lock()
另外,除非你想重新设置障碍,否则你应该使用pthread_barrier_init()pthread_barrier_wait()

关于linux - 实现障碍问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16796059/

10-13 08:44