2011-04-19 80 views
0

我有一個多線程程序,從dos提示符執行,有一些打印和輸出轉儲到DOS控制檯使用std :: cout,但是當線程1和線程2完成它的工作,然後加入()主應用程序,一些打印輸出和輸出重疊,並沒有對齊(沒有換行符,相互碰撞)。C++多線程文本輸出打印到dos控制檯重疊/弄亂輸出

有時他們沒事。如果你有一些建議,我非常感謝你的幫助。

Andrew

回答

2

嗯,很簡單。輸出沒有併發控制,你正在獲取數據競賽。您需要讓線程在使用輸出之前鎖定互斥鎖,然後在完成時釋放它。

+0

是的,我曾嘗試使用互斥鎖,但我沒有注意輸出。由於我創建了另一篇關於多線程的文章,其他人則說我可能不需要互斥體。我會讓他們回來看看會發生什麼。謝謝你的時代GMan。我明天讓你知道。我的筆記本電腦現在不在我身邊。 – AndrewS 2011-04-19 05:06:24

2

我的意思是,如果他們試圖在同一時間打印到相同的資源,我會期望它們重疊。

解決多線程中共享資源問題的常見方法是使用名爲互斥鎖(http://en.wikipedia.org/wiki/Mutex),信號量(http://en.wikipedia.org/wiki/Semaphore_(programming))或簡單地鎖的設備。當一個線程想要打印時,你需要抓住「鎖定令牌」,當它完成時,釋放它。如果鎖定令牌已被佔用,該線程將不得不等待,直到它可用。

這絕不是一個完整的解釋,但一些閱讀,以獲得有關問題的背景。

+0

Brad和GMan也有同樣的建議。我相信互斥是我的解決方案。非常感謝你們兩位。 – AndrewS 2011-04-19 05:08:07

+0

謝謝,夥計們。它通過在這些打印輸出之間執行mutex.lock()和mutex.unlock()來完美運行。 – AndrewS 2011-04-20 04:25:56

1

據我所知每個人在cout上的運算符都是線程安全的。我沒有參考證明這一點,但。

您可以(使用單個< <運營商即)

0

寫入輸出不是線程安全造成良莠不齊的輸出緩衝器處的stringstream的對象輸出,然後傾倒一氣呵成來清點。您需要同步對標準輸出的訪問,以便同時不能有一個以上的線程寫入輸出。最簡單的方法是使用互斥鎖,以便一個線程在標準輸出完成寫入之前「取得所有權」。

+0

謝謝。 Mutex正在工作。 – AndrewS 2011-04-20 04:27:18