我一直在做一个C程序,它用一系列线程代表过桥的车,我正确知道的功能是在某个时刻打印出桥的“状态”的功能,所以它显示了汽车(螺纹)在桥梁和哪个位置的位置。 问题是这样的;当只有一个螺纹交叉时,该功能打印正常,您可以看到汽车通过桥梁前进的表示。但是当有更多的线程越过函数变得疯狂时,有时你可以看到一个半桥,或两个桥或一些其他疯狂的东西。我试图解决它为该函数创建pthread_mutex但它不是解决方案,或者至少我没有在正确的地方使用它。 每个线程调用此函数,因为它在桥中前进(桥是一个数组) 对不起,如果我没说清楚;这是功能,感谢你的时间:
void printBridge(bridge *pBridge, int direction) {
system("clear");
int i;
if (direction == WEST) {
for (i = 0; i < bridgeSize; i++) {
pthread_mutex_lock(&print);
if (pBridge->cellState[i] == 0) { //this means the position at the array isn't occupied
fprintf(stderr, "\t");
} else if (pBridge->cellState[i] == 1) { //this means a car is at that position
fprintf(stderr, " @@@>"); //the cars are represented by @@@>
}
pthread_mutex_unlock(&print);
}
} else {
for (i = bridgeSize - 1; i >= 0; i--) { //if going the other direction
pthread_mutex_lock(&print);
if (pBridge->cellState[i] == 0) {
fprintf(stderr, "\t");
} else if (pBridge->cellState[i] == 1) {
fprintf(stderr, "<@@@ ");
}
pthread_mutex_unlock(&print);
}
}
printf("\n--------------------------------------------------------------------------\n");
fprintf(stderr, "\n Direction= %d", pBridge->direction);
sleep(1); //because I need to see what's going on
}
所以...正确的印刷品将是这样的:
<@@@ <@@@
--------------------------------------------------------------------------
但有时它会变得如此混乱:
<@@@ <@@@ <@@@ <@@@
--------------------------------------------------------------------------
<@@@ <@@@ <@@@ <@@@
Direction= 1--------------------------------------------------------------------------
可能是因为系统(“清除”)一次被许多线程执行了吗?
解决:
解决了调用pthread_mutex_lock并使用互斥锁为函数外部解锁数组的每个位置(桥接):
pthread_mutex_lock(&pBridge->mutexBridge[i]);
pBridge->cellState[i]=1;
printBridge(pBridge,dir);
pBridge->cellState[i]=0;
pthread_mutex_unlock(&pPuente->mutexBridge[i]);
由于某些原因,在printBridge函数内部,用互斥体包裹系统(“clear”):
pthread_mutex_lock(&print);
system("clear");
pthread_mutex_unlock(&print);
不做上面给了我疯狂的印刷品。感谢拍拍帮助
答案 0 :(得分:1)
您只能锁定单个车辆和空间的打印,因此,当打印多个线程时,它们将逐个车辆交叉桥梁。在开始打印桥之前需要获取互斥锁,并在完成后释放它。通过这种方式,线程将交错整个桥而不是单个车。