C#学习教程:使用volatile关键字与使用Interlocked类相比有什么优势吗?分享


使用volatile关键字与使用Interlocked类相比有什么优势吗?

换句话说,我可以使用常规变量和Interlocked类无法解决的volatile变量吗?

编辑:问题很大程度上改写

为了回答这个问题,我在这个问题上进一步深入研究,发现了一些我不知道的关于volatileInterlocked事情。 让我们清楚地了解这一点,不仅仅是为了我,而是为了这次讨论和其他人阅读:

现在我们有了规则,我们可以为您的问题定义答案:

如果您问我,最后一点是对volatile的实际需求,并且可能使其成为两个进程共享内存并且无需锁定即可读取或写入的理想选择。 在此上下文中将变量声明为volatile是更安全的,然后强制所有程序员使用Interlocked (编译器无法强制使用)。


编辑:以下引用是我原来答案的一部分,我会把它留在;-)

引用C#编程语言标准:

对于非易失性字段,考虑重新排序指令的优化技术可能导致multithreading程序中出现意外和不可预测的结果,这些程序访问没有同步的字段,例如lock-statement提供的字段。 这些优化可以由编译器,运行时系统或硬件执行。 对于易失性字段,此类重新排序优化受到限制:

更新:大部分重写的问题,纠正了我的原始回复并添加了“真实”的答案

这是一个相当复杂的话题。 我发现Joseph Albahari的文章是.NET Framework中multithreading概念的更明确和准确的来源之一,可能有助于回答您的问题。

但是,为了快速总结, volatile关键字和Interlocked类之间有很多重叠,只要它们如何使用。 当然,这两种方法都超出了普通变量的范围。

是的 – 您可以直接查看该值。

只要你只使用Interlocked类来访问变量,那就没有区别了。 volatile的作用是告诉编译器该变量是特殊的,并且在优化它时不应该假设该值没有改变。

采取这个循环:

 bool done = false; ... while(!done) { ... do stuff which the compiler can prove doesn't touch done... } 

如果你在另一个线程中将done设置为true ,你会期望循环退出。 但是 – 如果完成没有标记为volatile那么编译器可以选择实现循环代码永远不会改变,并且可以优化退出比较。

这是multithreading编程的难点之一 – 许多问题的情况只在某些情况下出现。

我不会试图成为这个主题的权威,但我强烈建议你由吹嘘的Jon Skeet看看这篇文章 。

另请参阅本答案的最后部分,详细说明应使用哪种volatile

是的,您可以通过使用volatile变量而不是锁来获得一些性能。

Lock是一个完整的内存屏障,它可以为您提供与volatile变量相同的特性以及许多其他变量。 正如已经说过的那样,volatile只是确保在multithreading场景中,如果CPU更改其缓存行中的值,其他CPU会立即看到该值,但根本不确保任何锁定语义。

事情是锁定比volatile更强大,你应该使用volatile来避免不必要的锁定。

上述就是C#学习教程:使用volatile关键字与使用Interlocked类相比有什么优势吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960169.html

发表评论

邮箱地址不会被公开。 必填项已用*标注