辅助功能volatile变量

时间:2016-08-28 18:48:33

标签: c#

当我使用volatile关键字声明某个变量时,它现在是完全线程安全的,还是应该在某些情况下通过Interlocked类或lock语句访问它?< / p>

1 个答案:

答案 0 :(得分:2)

volatile关键字只插入一个完整的memory barrier - 保证完成CPU管道上的所有读写指令。对于最终用户,保证了其他线程中的可见性,因为在完成写入时,结果被推送到CPU的高速缓存(如果需要,则被推送到RAM)。在最近的Intel CPU上运行应用程序时,您不应该关心这一点 - 它们保证了读取和写入的障碍,而无需额外的明确指示。

另一方面,Interlocked通过给定的内存地址锁定CPU总线,并允许您对变量执行原子操作,因此没有其他CPU内核可以通过相同的内存地址执行其他读写操作同时。这些原子操作实际上是让我们说x86 CPU架构系列的指令,这就是为什么你有一些有限的操作:添加,增量,减量,交换,比较交换。

volatileInterlocked都与CPU功能相关,但常见的同步原语 - 临界区,自旋锁,互斥锁,信号量,自动/手动重置事件 - 都建立在它之上。 / p>