gpt4 book ai didi

c# - Thread.VolatileRead 实现

转载 作者:IT王子 更新时间:2023-10-29 04:22:00 27 4
gpt4 key购买 nike

我正在查看 VolatileRead/VolatileWrite 方法的实现(使用 Reflector),我对某些事情感到困惑。

这是 VolatileRead 的实现:

[MethodImpl(MethodImplOptions.NoInlining)]
public static int VolatileRead(ref int address)
{
int num = address;
MemoryBarrier();
return num;
}

读取“address”的值后怎么设置内存屏障?不应该是相反的吗? (放置在读取值之前,因此任何对“地址”的未决写入将在我们进行实际读取时完成。VolatileWrite 也是如此,其中内存屏障位于之前 赋值。这是为什么?另外,为什么这些方法有 NoInlining 属性?如果内联它们会发生什么?

最佳答案

直到最近我还这么认为。 volatile 读取不是您所想的那样——它们不是为了保证它们获得最新的值(value);他们要确保程序代码后面的读取不会移动到this读取之前。这就是规范所保证的 - 同样对于 volatile 写入,它保证不会将较早的写入移动到 volatile 写入之后。

你是 not alone怀疑这段代码,但是Joe Duffy explains it better than I can :)

我对此的回答是放弃无锁编码,而不是使用像 PFX 这样旨在将我与它隔离的东西。内存模型对我来说太难了 - 我会把它留给专家,并坚持使用我知道是安全的东西。

总有一天我会更新我的线程文章来反射(reflect)这一点,但我认为我需要先能够更明智地讨论它......

(我不知道非内联部分,顺便说一句。我怀疑内联可能会引入一些其他优化,这些优化不会发生在 volatile 读/写周围,但我很容易出错......)

关于c# - Thread.VolatileRead 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com