问题是我们必须使用 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);
}
}
或者有没有办法改变障碍的计数参数?