【问题标题】:Is C# += thread safe?C# += 线程安全吗?
【发布时间】:2013-10-12 12:22:32
【问题描述】:

刚刚遇到一个程序,其中 += 用于线程间的共享变量,所以 += 线程安全,即以原子方式执行加法和赋值?

【问题讨论】:

  • 不,不是。它正在写入一个变量。
  • 没有。它正在读取,进行加法,然后写入变量。它不是原子的。
  • 自动增量需要互锁才能线程安全。
  • 这可能对stackoverflow.com/questions/4628243/… 有所帮助。答案是从不

标签: c# multithreading


【解决方案1】:

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

int temp = orig + value;
orig = temp;

您可以改用Interlocked.Add

Interlocked.Add(ref orig, value);

【讨论】:

    【解决方案2】:

    你想要

    System.Threading.Interlocked.Add()
    

    【讨论】:

      【解决方案3】:
      string s += "foo";
      

      string s = s + "foo";
      

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

      【讨论】:

        【解决方案4】:

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

        int count = 0;

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

        【讨论】:

          猜你喜欢
          • 2019-09-20
          • 2021-01-15
          • 2010-11-24
          • 2019-05-23
          • 2011-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多