2013-08-16 93 views
0

我的程序有2個線程和一個int全局變量。一個線程正在讀取該變量,另一個線程正在寫入該變量。我應該在這種情況下使用互斥鎖。從線程讀取全局變量並從另一個線程寫入該變量

這些函數在我的程序中同時並重復執行2個線程。

void thread1() 
{ 
    if (condition1) 
     iVariable = 1; 
    else if (condition2) 
     iVariable = 2; 
} 

void thread2() 
{ 
    if (iVariable == 1) 
     //do something 
    else if (iVarable == 2) 
     //do another thing 

} 

回答

1

如果您不使用任何同步,那麼當第二個線程看到更新的值時,它是完全不可預知的。這個範圍介於幾納秒和從不之間。 永不結果當然是特別麻煩的,當你不聲明變量易變並且運行程序的Release版本時,它可能發生在x86處理器上。對於內存較弱的處理器,如ARM內核,可能需要很長時間。您唯一不必擔心的是看到部分更新的值,int更新是原子的。

這就是關於發佈的代碼可以說的一切。細粒度鎖定很少效果。

+0

說,thread1()將分配1給iVariable(比如說,iVariable的舊值爲0)。同時,thread2()函數計算if條件中的(iVariable == 1)表達式。我知道由(iVariable == 1)表達式返回的布爾值是不可預知的。但是我想知道在執行thread1()函數後,iVariable1的值是1還是其他一些垃圾值。 – SRF

+0

這是「我不必擔心的唯一事情」,我在答案中提到。 –

+0

然後沒有什麼可擔心的。沒有任何將互斥鎖鎖定爲不會將垃圾值分配給iVariable的問題。 – SRF

1

是的,你應該(在大多數情況下)。互斥體將確保您正在保護的數據將從多個競爭CPU正確可見。除非你有性能問題,否則你應該使用互斥鎖。如果性能問題,請查看無鎖數據結構。

+1

如果沒有圍繞iVariable的互斥體,很可能並非所有CPU在多核/ CPU系統中都會在您認爲應該發現的時候看到更新。這些內存可見性競爭條件中的一些可能高度取決於機器。所以,使用互斥鎖,自旋鎖或原子變量。 –

相關問題