linux - 实现障碍问题

标签 linux pthreads

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/

相关文章:

linux - 为什么 OS X 上的 `cat` 在附加时无法识别输入文件是否与输出文件匹配?

c++ - pthread_cond_wait() 能否始终赢得锁定互斥体的竞争?

locking - 票证锁定算法性能?

c - 将带有数组的结构传递给多个线程

C - 错误条件的定时器逻辑

linux - 隐藏多个 Excel 工作表

c# - 从 Mono 运行时 ServiceStack 不发送 cookie

linux - 在 Raspberry Pi 上部署

c - Pthread 条件变量和无死锁

linux - 如何更改 openwrt Makefiles 以仅生成一个图像