如何更改pthread_barrier的计数?

时间:2013-04-04 09:05:30

标签: c pthreads

问题是我们必须使用pthreads实现一种“运行竞赛”。在一个轨道之后我们必须等到所有的跑步者/线程完成到此为止,所以我们使用了一个屏障。

但现在我们还要实施受伤的可能性。所以我们写了一个函数,它有时会减少跑步者的数量,并用较小的数量重新初始化障碍。现在的问题是该程序并不总是终止。我想这样做的原因是有些线程已经处于障碍状态,重新初始化后,所需的数量没有到达。

模拟伤害的代码如下:

void simulateInjury(int number) {
    int totalRunners = 0;
    int i = 0;
    if (rand() % 10 < 1) {
        printf("Runner of Team %i injured!\n", number);
        pthread_mutex_lock(&evaluate_teamsize);
        standings.teamSize[number]--;
        for (i = 0; i < teams; i++) {
            totalRunners += standings.teamSize[i];
        }
        pthread_barrier_destroy(&barrier_track1);
        pthread_barrier_destroy(&barrier_track4[number]);
        pthread_barrier_init(&barrier_track1, NULL, totalRunners);
        pthread_barrier_init(&barrier_track4[number], NULL, standings.teamSize[number]);
        pthread_mutex_unlock(&evaluate_teamsize);
        pthread_exit(NULL);
    }
}

或者有没有办法只改变障碍的计数参数?

1 个答案:

答案 0 :(得分:0)

我看到两个错误:

  1. 在某些线程使用时,您不应重新初始化屏障 它。
  2. 您不应该执行屏障的重新初始化 同时由几个线程组成。
  3. 对于第一个,您可以创建第二个屏障,与第一个屏障交替使用。 对于第二个,您应该使用wait函数的返回值来指定一个将重新初始化的特定线程。