gpt4 book ai didi

c# - 为什么不在 System.Double 和 System.Long 上使用 volatile?

转载 作者:IT王子 更新时间:2023-10-29 03:57:46 24 4
gpt4 key购买 nike

像我这样的问题是asked ,但我的有点不同。问题是,“为什么 C# 中的 System.DoubleSystem.Int64 等类型不允许使用 volatile 关键字?”

乍一看,我回答了我的同事,“嗯,在 32 位机器上,这些类型至少需要两次滴答才能进入处理器,而 .Net 框架有意抽象出特定于处理器的细节像那样。”他对此回应说:“如果它因为特定于处理器的问题而阻止您使用某项功能,那么它就不是抽象任何东西!”

他暗示处理器特定的细节不应该显示给使用框架的人,该框架从程序员那里“抽象”了这样的细节。因此,框架(或 C#)应该抽象出那些并做它需要做的事情来为 System.Double 等(无论是信号量、内存屏障还是其他)提供相同的保证.我认为框架不应该在 volatile 上增加信号量的开销,因为程序员不希望使用这样的关键字产生这样的开销,因为 32 位不需要信号量类型。 64 位类型的更大开销可能令人惊讶,因此,.Net 框架最好不要允许它,并且如果开销可以接受,让您在更大的类型上执行自己的信号量。

这导致我们调查了 volatile 关键字的全部内容。 (参见 this 页)。该页面在注释中指出:

In C#, using the volatile modifier on a field guarantees that all access to that field uses VolatileRead or VolatileWrite.

Hmmm.....VolatileReadVolatileWrite 都支持我们的 64 位类型!!那么我的问题是,

"Why is the volatile keyword not allowed in C# on types System.Double and System.Int64, etc.?"

最佳答案

He's implying that a processor-specific detail should not show up to a person using a framework that "abstracts" details like that away from the programmer.

如果您正在使用 volatile 字段、显式内存屏障等低锁技术,那么您完全处于处理器特定细节的世界中。您需要深入了解处理器可以做什么和不允许做什么,例如重新排序、一致性等,以便编写使用低锁技术的正确、可移植、健壮的程序。

此功能的要点是说“我正在放弃由单线程编程保证的方便的抽象,并通过深入了解我的处理器的特定实现知识来获得可能的性能提升。”当您开始使用低锁技术时,您应该期待更少的抽象,而不是更多的抽象

大概是出于某种原因,您要“精打细算”;你付出的代价是必须应对所述金属的怪癖。

关于c# - 为什么不在 System.Double 和 System.Long 上使用 volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4727068/

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