8

刚刚遇到一个程序,其中 += 用于线程之间的共享变量,那么 += 线程安全吗,即原子地执行加法和赋值?

4

4 回答 4

10

不,它不是线程安全的,因为它相当于:

int temp = orig + value;
orig = temp;

您可以Interlocked.Add改用:

Interlocked.Add(ref orig, value);
于 2013-10-11T20:50:37.513 回答
2

你要

System.Threading.Interlocked.Add()
于 2013-10-11T20:50:38.607 回答
1
string s += "foo";

string s = s + "foo";

s被读取然后重新分配。如果在这两个动作之间的值s被另一个线程更改,结果会不同,所以它不是线程安全的。

于 2013-10-11T20:51:20.893 回答
0

谢谢大家的快速回复。是的,+= 不是线程安全的,为了验证这一点,可以运行以下简单程序。

int count = 0;

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

于 2013-10-12T04:22:32.283 回答