Linux 实施障碍问题 static int barrier\u计数器=0; p线程条件; pthread_mutex_t local_lock; int初始屏障(int n){ if(n

Linux 实施障碍问题 static int barrier\u计数器=0; p线程条件; pthread_mutex_t local_lock; int初始屏障(int n){ if(n,linux,pthreads,Linux,Pthreads,我们试图实现障碍,但不知何故,我们不能做广播,我们无论如何完成。 我们甚至没有死锁,实际上有几个线程在等待,但不是我们在init_barrier中指定的数量。需要一个锁定的互斥锁。调用pthread\u mutex\u trylock()可能会失败,因此在不获取互斥锁的情况下继续 我建议你改用 此外,除非您希望重新实现屏障,否则应该使用and。不要在此处使用trylock,它可能会失败,这将使您的pthread\u cond\u wait可能无法按预期工作。还有,为什么不使用pthread的屏障

我们试图实现障碍,但不知何故,我们不能做广播,我们无论如何完成。 我们甚至没有死锁,实际上有几个线程在等待,但不是我们在init_barrier中指定的数量。

需要一个锁定的互斥锁。调用
pthread\u mutex\u trylock()
可能会失败,因此在不获取互斥锁的情况下继续

我建议你改用


此外,除非您希望重新实现屏障,否则应该使用and。

不要在此处使用trylock,它可能会失败,这将使您的
pthread\u cond\u wait
可能无法按预期工作。还有,为什么不使用pthread的屏障呢?@artlessnoise,这不是关于内存屏障的。@JonathanWakely-Thx。删除linux内核标签可能是有意义的。@Hasturkun:你应该加上它作为答案——这几乎肯定是问题所在。
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;
}