非阻塞变量更新

时间:2017-04-14 08:56:10

标签: c# multithreading volatile

我将通过Volatile.Write对变量实现非阻塞写入。我应该对此变量的所有消费者使用Volatile.Read,还是没有必要?如果我像往常一样阅读这个变量(没有任何障碍),可能会产生什么样的影响?关于Interlocked.Exchange

的同样问题

1 个答案:

答案 0 :(得分:1)

来自the documentation of the Volatile class

  

调用其中一种方法只会影响单个内存访问。要为字段提供有效的同步,对字段的所有访问都必须使用Volatile.Read和Volatile.Write。

可能出错的一个问题是读者可能会将值一次读入寄存器,然后继续读取此缓存副本,而无需检查该值是否已更改。

Interlocked.Exchange相同。

通常,处理这类情况的最佳方法是将变量完全封装在一个类中,该类提供一个getter-setter对,通过VolatileInterlocked访问变量,从而保证该变量永远不会被任何其他方式访问。