gpt4 book ai didi

C pthread打印 "anomaly"

转载 作者:行者123 更新时间:2023-11-30 15:36:03 26 4
gpt4 key购买 nike

我一直在用 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--------------------------------------------------------------------------

是否是因为system("clear")同时被多个线程执行?

已解决:

解决了调用 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);

不执行上述操作会给我带来疯狂的打印结果。感谢帕特的帮助

最佳答案

您仅锁定单个汽车和空间的打印,因此,当多个线程打印时,它们将逐辆车交错桥梁。您需要在开始打印桥之前获取互斥锁,并在完成后释放它。通过这种方式,线程将交织整个桥梁而不是单个汽车。

关于C pthread打印 "anomaly",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com