Interlocked.Exchange和Volatile.Write之间的区别?
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.Write
或Interlocked.Exchange
。 因为双重更新不能保证是primefaces的http://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx
在这个问题的答案中,我希望看到Volatile和Interlocked类的详细比较。 为什么我们需要2节课? 哪一个和何时使用?
Interlocked.Exchange使用保证primefaces操作的处理器指令。
Volatile.Write也是如此,但它还包括一个内存屏障操作。 由于Windows 8上支持ARM处理器,我认为微软在DotNet 4.5上增加了Volatile.Write。英特尔和ARM处理器在内存操作重新排序上有所不同。
在Intel上,您可以保证内存访问操作的执行顺序与它们的顺序相同,或者至少不会重新排序写操作。
从英特尔®64和IA-32架构软件开发人员手册,第8章:
8.2.2 P6和更近期处理器系列中的存储器排序英特尔酷睿2双核,英特尔凌动,英特尔酷睿双核,奔腾4和P6系列处理器也使用处理器排序的内存排序模型,可进一步定义为“写入”以存储缓冲区转发命令。“此模型的特征如下。
在ARM上,您没有这种保证,因此需要内存屏障。 可以在此处找到解释此内容的ARM博客: http : //blogs.arm.com/software-enablement/594-memory-access-ordering-part-3-memory-access-ordering-in-the-arm-architecture/
在您的示例中,由于使用double的操作不保证是primefaces操作,我建议使用锁来访问它。 请记住,在读取和设置值时,必须对代码的两个部分使用锁定。
更完整的示例更好地回答您的问题,因为不清楚在设置这些值之后会发生什么。 对于向量,如果您有更多的读者而不是编写者,请考虑使用ReaderWriterLockSlim对象: http : //msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
线程数和读/写频率可以显着改变锁定策略。
- 无法使ApplyCurrentValues(Entity)在Entity Framework 5中工作
- 如何使用System.Net.HttpListener在WebSocket中启用SSL
- 以对数刻度显示刻度标签MS Chart(log-log)
- 具有动态maxCount的SemaphoreSlim
- 如何将任务链接到它的前一个实例?
- 是CancellationTokenSource.CancelAfter()是否泄漏?
- 为什么IPAddress.Parse(“192.168.001.001”)有效,而IPAddress.Parse(“192.168.001.009”)没有?
- 使用图像+文本设置WPF按钮的样式
- 如何在此父方法中等待没有异步修饰符的异步方法?