Interlocked.Exchange和Volatile.Write之间的区别?(differen

2019-07-31 14:38发布

是什么Interlocked.Exchange和Volatile.Write之间的区别?

一些变量的两种方法更新值。 有人可以总结时要使用他们每个人的?

http://msdn.microsoft.com/ru-ru/library/bb337971和http://msdn.microsoft.com/en-us/library/gg712713.aspx

特别是我需要更新我的阵列的双项目,我想另一个线程看到最新鲜的价值。 什么是最好? Interlocked.Exchange(ref arr[3], myValue)Volatile.Write(ref arr[3], info); 其中arr被声明为double

================================================== ==========================真实的例子,我宣布类似的双数组:

private double[] _cachedProduct;

在一个线程更新它这样的:

        _cachedProduct[instrumentId] = calcValue;
        ...
        are.Set();

在另一个线程我读这阵这样的:

        while(true) {
            are.WaitOne();
            ...
                result += _cachedProduct[instrumentId];
            ...
        }

对我来说,它只是正常工作原样。 然而,为了确保“它会永远工作”不管是什么,似乎我应该添加任何Volatile.WriteInterlocked.Exchange 。 由于双更新不guaranted是原子http://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx

在回答这个问题,我想看到的挥发性和互锁类的详细比较。 我们为什么需要2班? 哪一个,以及何时使用?

Answer 1:

所述Interlocked.Exchange使用,保证一个原子操作的处理器指令。

所述Volatile.Write做同样的,但它也包括存储器屏障操作。 我认为微软加入Volatile.Write上DOTNET的4.5由于在Windows 8的英特尔和ARM处理器的支持ARM处理器的不同,对存储器操作重新排序。

在Intel上,你有一个保证存储器存取操作将在它们被发出,或者至少是一个写操作将无法重新排序相同的顺序进行。

从英特尔®64和IA-32架构软件开发者手册,第8章:

在P6 8.2.2存储器排序和最近的处理器系列的英特尔Core 2 Duo,英特尔原子,英特尔酷睿,奔腾4,和P6系列处理器还使用可以被进一步限定为在处理器有序存储器排序模式“写与存储缓冲转发命令。”这种模式可被表征为如下。

在ARM你没有这种保障,所以需要一个内存屏障。 手臂博客解释这个可以在这里找到: http://blogs.arm.com/software-enablement/594-memory-access-ordering-part-3-memory-access-ordering-in-the-arm-architecture/

在你的榜样,采用双操作不保证是原子,我会建议一个锁来访问它。 请记住,你必须使用锁在你的代码的两个部分,阅读和设定值时。

一个更完整的例子会更好地回答你的问题,因为目前尚不清楚这些值设置之后会发生什么。 对于一个矢量,如果你有比作家更多的读者,可以考虑使用ReaderWriterLockSlim对象: http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

线程的数量和读取的频率/写操作可以极大地改变你的锁定策略。



文章来源: difference between Interlocked.Exchange and Volatile.Write?
标签: c# .net-4.5