2013-10-11 185 views
6

剛剛遇到一個程序,其中線程間共享變量使用+ =,因此+ =線程安全,即以原子方式執行添加和賦值?C#+ =線程安全嗎?

+3

不,不是。它寫入一個變量。 –

+4

不是。正在閱讀,正在進行添加,然後寫入變量。它不是原子的。 – Gray

+2

自動增量需要互鎖以確保線程安全。 – RBarryYoung

回答

7

不,它不是線程安全的,因爲它等同於:

int temp = orig + value; 
orig = temp; 

您可以使用Interlocked.Add代替:

Interlocked.Add(ref orig, value); 
1

你想

System.Threading.Interlocked.Add() 
0
string s += "foo"; 

string s = s + "foo"; 

s被讀取,然後重新分配。如果在這兩個動作之間s的值被另一個線程改變,結果會不同,所以它不是線程安全的。

0

謝謝大家的快速回復。是的,+ =不是線程安全的並且驗證這個可以運行以下簡單程序。

int count = 0;

 Parallel.For(0, 10000, i => 
     { 
      count +=1; // not thread safe 
     }); 
     Console.WriteLine(count);