我想知道复合赋值^=在C#中是否是原子赋值。我真正需要做的是用一个原子操作旋转Int32变量(如果值为0,则将其设置为1,如果值为1,则将它设置为0)。
如上所述,x^=1不是原子。你能使用Interlocked.Increment(它是原子的),然后在读取时考虑值%2吗?
保证为原子的操作收集在Interlocked
类中。看见http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx
复合赋值不是原子赋值。例如,x += 1
是从内存中读取x、加1并将值写回内存的语法糖。
如果你想很好地解释什么是原子,什么不是原子,请阅读Eric Lippert的博客文章:原子性、volatily和不变性是不同的