我想知道复合赋值^ =在C#中是否为原子。 我真正需要做的是旋转(如果值为0然后将其设置为1,如果它为1则将其设置为0)具有单个原子操作的Int32变量。
答案 0 :(得分:4)
如上所述,x ^ = 1不是原子的。你可以使用Interlocked.Increment(这是原子的)然后,在阅读时,考虑值%2?
答案 1 :(得分:3)
保证为原子的操作在Interlocked
类中收集。见http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx
答案 2 :(得分:2)
复合赋值不是原子的。例如x += 1
是从内存中读取x的语法糖,添加1并将值写回内存。
如果你想要一个很好的解释什么是原子和什么不是原子阅读Eric Lippert关于这个主题的博客文章:Atomicity, volatitly and immutability are different