2011-06-05 106 views
0

我知道多線程編程應該很難。但似乎事情找到了一種奇怪的破壞方式。例如,我有多個線程都改變了控制檯的顏色和寫入(它是一個錯誤日誌)。當互斥鎖不夠時?

有2個問題:

  • jambled文本
  • 顏色變化的干擾/沒有在正確的時間

當我添加了一個互斥鎖改變控制檯的顏色和寫部分到控制檯,它幫助干擾文本(從互斥鎖以來沒有看到),但控制檯顏色仍然是錯誤的。

所以看來互斥量是不夠的!我現在認爲我需要一個隊列和一個等待該隊列的線程,並在其中有東西時刷新它。所以我的問題是,你如何評估一個互斥鎖是否足夠?只要涉及管道/文件/通訊/另一個進程?

+2

從您對問題的描述中很難說出任何內容。鎖通常是足夠的,因爲它們隔離進行原子修改的事務。 – 2011-06-05 18:32:11

+1

由於您有兩個互斥鎖或者錯誤地梳理了顏色變化並寫入一個鎖定操作,它會進行讀取。 – 2011-06-05 18:33:38

+3

聽起來好像你的函數改變了一個全局狀態(控制檯顏色),然後假設全局狀態即使在釋放互斥鎖之後仍然有效。 – 2011-06-05 18:35:17

回答

0

一個互斥體(如boost/pthread互斥體)將保證獨佔訪問不同線程之間的共享資源(但不是進程,你需要一個指定的信號量)。

這聽起來像你的共享資源是訪問終端。僅僅因爲您在更改顏色時將其鎖定,並不表示在您決定更改顏色時它會被鎖定。在寫入終端或更改顏色之前,兩個線程都會鎖定互斥鎖。由於您仍在保護單個共享資源(終端),因此製作兩個互斥體並不是非常必要。

如果一個線程既想寫文本又要改變顏色,互斥量必須支持遞歸鎖定,如recursive_mutex