允许C#编译器优化局部变量并从内存中重新获取值

允许C#编译器优化局部变量并从内存中重新获取值,第1张

概述编辑:我想问当两个线程在没有正确同步的情况下同时访问相同数据时会发生什么(在此编辑之前,该点没有被清楚地表示). 我有一个关于由C#编译器和JIT编译器执行的优化的问题. 考虑以下简化示例: class Example { private Action _action; private void InvokeAction() { var local = this. 编辑:我想问当两个线程在没有正确同步的情况下同时访问相同数据时会发生什么(在此编辑之前,该点没有被清楚地表示).

我有一个关于由C#编译器和JIT编译器执行的优化的问题.

考虑以下简化示例:

class Example {    private Action _action;    private voID InvokeAction() {        var local = this._action;        if (local != null) {            local();        }    }}

在示例中,请忽略读取_action可能会产生缓存和过期的值,因为没有volatile说明符或任何其他同步.这不是点:)

编译器(或实际上是运行时的抖动)允许优化到局部变量的赋值,而是从内存中读取_action两次:

class Example {    private Action _action;    private voID InvokeAction() {        if (this._action != null) {            this._action(); // might be set to null by an other thread.        }    }}

当字段_action通过并发分配设置为null时,可能会抛出NullReferenceException.

当然,在这个例子中,这样的“优化”将不会有任何意义,因为将值存储在寄存器中并因此使用局部变量将更快.但是在更复杂的情况下,有没有保证这样工作,如果没有重新读取记忆的价值?

解决方法 根据ECMA规范中定义的内存模型进行合法优化.如果_action是易失性的,内存模型将保证该值只读一次,因此此优化不会发生.

不过,我认为目前微软的CLR实现不会优化局部变量.

总结

以上是内存溢出为你收集整理的允许C#编译器优化局部变量并从内存中重新获取值全部内容,希望文章能够帮你解决允许C#编译器优化局部变量并从内存中重新获取值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1261135.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存