【问题标题】:Are incrementers / decrementers (var++, var--) etc thread safe?增量器/减量器(var++,var--)等线程安全吗?
【发布时间】:2009-01-14 16:00:40
【问题描述】:

受此问题启发:In Complexity Analysis why is ++ considered to be 2 operations?

取下面的伪代码:

class test
{
   int _counter;
   void Increment()
   {
     _counter++;
   } 
}

这在 x86 架构上会被认为是线程安全的吗?此外,Inc / Dec 汇编指令线程安全吗?

【问题讨论】:

  • jit 编译器?哪个平台的?
  • 我们是在谈论 Java 还是 C# 或其他什么?
  • 这个问题绝对不是语言无关的!这在很大程度上取决于您使用的语言和/或平台!
  • 对不起,我的意思是留下问题的 jit 部分......
  • 这能回答你的问题吗? Can num++ be atomic for 'int num'?

标签: multithreading language-agnostic


【解决方案1】:

不,递增不是线程安全的。 INCDEC 指令也不是。它们都需要加载和存储,并且在另一个 CPU 上运行的线程可以在这些操作之间交错的同一内存位置进行自己的加载或存储。

一些语言内置了对线程同步的支持,但这通常是您必须要求的,而不是您在每个变量上自动获得的东西。那些没有内置支持的人通常可以访问提供类似功能的库。

【讨论】:

    【解决方案2】:

    一句话,没有。

    您可以使用 InterlockedIncrement() 之类的东西,具体取决于您的平台。在 .NET 上,您可以使用 Interlocked 类方法(例如 Interlocked.Increment())。

    Rob Kennedy mentioned,即使操作是根据单个 INC 指令实现的,就内存而言,执行一组读/递增/写步骤。多处理器系统存在损坏的机会。

    还有volatile 问题,这将是使操作线程安全的必要部分 - 但是,标记变量volatile 不足以使其成为线程安全的。使用平台提供的联锁支持。

    这通常是正确的,当然在 x86/x64 平台上也是如此。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2013-03-13
      • 2017-04-14
      • 2022-08-17
      • 1970-01-01
      • 2011-11-30
      • 2013-03-31
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多