2014-03-28 84 views
0

我一直在做一個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朦朧的印花。感謝您的幫助

+0

可能,試着把鎖也放在那。 –

+0

不是那個東西:( – dlvx

+0

)如果一個線程處於打印過程中,而另一個線程清除了屏幕,您認爲會發生什麼?(如果答案是「我不知道」,那麼您最好使) –

回答

1

您只鎖定打印各個車廂和空間,因此,當多個線程正在打印時,它們會將汽車上的橋樑交錯排列。在開始打印橋並在完成之後釋放它時,您需要獲取互斥鎖。通過這種方式,線程將交織整個橋而不是單獨的汽車。

+0

您也可以使用'flockfile'和'funlockfile'來鎖定工作室'FILE's(在這種情況下爲'stderr')。但是,您仍然需要鎖定整個打印功能的鎖定。 – pat

+0

但鎖定整個功能只會打印「一次一輛車」,對嗎? – dlvx

+1

不,您的功能在打印每輛車的橋尺寸上循環。如果兩個線程同時嘗試打印該橋,則希望一個線程在另一個線程可以啓動之前完成打印。通過在開始時獲取鎖定,並在打印橋的末端釋放鎖定,可以保證一次最多隻能打印一個線程。 – pat