增量器/减量器(var ++,var--)等线程是否安全?

Jos*_*rke 15 language-agnostic multithreading

灵感来自这个问题:在复杂性分析中,为什么++被认为是2个操作?

请使用以下伪代码:

class test
{
   int _counter;
   void Increment()
   {
     _counter++;
   } 
}
Run Code Online (Sandbox Code Playgroud)

在x86架构上,这会被认为是线程安全的吗?还有更多的是Inc/Dec装配说明线程安全吗?

Rob*_*edy 32

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

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


Mic*_*urr 13

总之,没有.

您可以使用类似于InterlockedIncrement()您的平台的东西.在.NET上,您可以使用Interlocked类方法(Interlocked.Increment()例如).

罗布肯尼迪提到,即使操作在单个方面实现INC指令,只要存储器而言的步骤的读/增量/写集合被执行.多处理器系统有机会腐败.

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

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