3

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

但是现在我们还必须执行受伤的概率。所以我们写了一个函数,它有时会减少跑步者的数量,并用更小的数量重新初始化屏障。现在的问题是程序并不总是终止。我猜这是因为一些线程已经在屏障处,并且在重新初始化它们之后,所需的数量没有到达。

模拟伤害的代码如下所示:

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);
    }
}

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

4

1 回答 1

0

我看到两个错误:

  1. 当某个线程正在使用屏障时,您不应该重新初始化屏障。
  2. 您不应由多个线程同时执行屏障的重新初始化。

对于第一个,您可以创建第二个屏障,与第一个交替使用。对于第二个,您应该使用等待函数的返回值来指定一个将执行重新初始化的特定线程。

于 2013-04-04T12:06:52.967 回答