我一直在做一個C程序,它使用一系列線程來表示汽車穿越橋,我正在做的權利知道的功能是打印「狀態」的在某個特定的時刻橋樑,所以它顯示了汽車(螺紋)在橋上和在哪個位置。 問題是這樣的;當只有一根線穿過時,功能打印正確,您可以看到汽車在橋上前進的表示形式。但是當有更多的線程穿越這個功能會變得瘋狂,有時你會看到一座半橋,或者兩座橋或者其他一些瘋狂的東西。我試圖解決它爲該功能創建pthread_mutex,但它不是解決方案,或者至少我沒有在正確的地方使用它。 每一個線程在通過網橋時都會調用這個函數(橋是一個數組) 對不起,如果我沒有說清楚;這裏是功能,感謝您的時間:一個正確的打印會是這樣C pthread打印「異常」
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函數內,用互斥體包裹了系統(「清除」):
pthread_mutex_lock(&print);
system("clear");
pthread_mutex_unlock(&print);
不這樣做給了我cr朦朧的印花。感謝您的幫助
可能,試着把鎖也放在那。 –
不是那個東西:( – dlvx
)如果一個線程處於打印過程中,而另一個線程清除了屏幕,您認爲會發生什麼?(如果答案是「我不知道」,那麼您最好使) –