2011-12-17 51 views
1

在一個線程(線程2)中,我更改了一個值,例如在兩個線程之間保持布爾值同步

CheckSuccess = false; 

現在主線程(線程1 - GUI /表)不皮卡的變化,會怎樣纔有可能「傳播完成」的轉變周圍的所有主題?

我是線程應該處理數據,在單獨的情況下無法正常工作(除非告知這樣做)

+2

它被標記爲[volatile](http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx)? – oleksii 2011-12-17 13:26:02

+0

主線程是否主動監視布爾值,或者變得知道已被更改? – Dykam 2011-12-17 13:33:06

+0

背景工作者提供Completed和ProgressChanged事件來處理這個問題。 – 2011-12-17 13:35:44

回答

2

這似乎是一個Race Condition的印象。爲了避免這種情況,您應該同步對共享變量的訪問。

  • 如果CheckSuccess是一個字段,請嘗試將其標記爲volatile關鍵字。
  • 如果CheckSuccess是一個屬性(將被轉換成一個方法調用),可以使用lock() statement

    private static readonly object stateLock = new object(); 
    lock (stateLock) 
    { 
        // access a shared variable here 
        CheckSuccess = false; 
    } 
    
  • 如果CheckSuccess是UI控件的屬性,你想從一個工人線程改變它 - 您應該使用特殊技術將工作變更推送到UI線程,這取決於您使用的是WPF的WinForms框架。

PS: 此外,如果有多個線程讀取值和幾個線程寫入(基本上比寫讀更多)你可能會發現有用ReaderWriterLock

+0

它不會解決競爭條件,因爲它只是寫一個原子值。只是不正​​確的執行順序。 – Dykam 2011-12-17 13:32:27

+0

@Dykam:我相信CheckSuccess是一個翻譯成方法調用的屬性,但需要澄清一下,這可能是一個字段的錯誤命名 – sll 2011-12-17 13:37:00

+0

在這種情況下的確如此。 – Dykam 2011-12-17 14:54:07

0

我沒有正式使用聯鎖方法,如Exchange。這比使用鎖定對象簡單得多,它保證是原子的。

0

問題很可能是編譯器優化導致在CPU寄存器中緩存布爾值。聲明它爲volatile應該可以解決你的問題。