问题是我们必须使用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);
}
}
或者有没有办法只改变障碍的计数参数?
答案 0 :(得分:0)
我看到两个错误:
对于第一个,您可以创建第二个屏障,与第一个屏障交替使用。 对于第二个,您应该使用wait函数的返回值来指定一个将重新初始化的特定线程。