C#
中不允许在System.Double
和System.Int64
等类型上使用volatile
关键字?”乍一看,我回答我的同事,“嗯,在32位机器上,那些类型至少需要两个滴答声才能进入处理器,并且.Net框架有意抽象掉处理器特定的细节。” 他回答道,“如果因为处理器特定问题而阻止你使用一个功能,那么它就没有抽象任何东西!”
他暗示使用框架的人不应该看到处理器特定的细节,框架(或C#)应该将它们抽象掉并执行需要完成
System.Double
等的相同保证的操作(无论是Semaphore、内存屏障还是其他)。 我争辩说,框架不应该在volatile
上添加Semaphore的开销,因为程序员不期望使用这种关键字会带来这种开销,因为32位类型不需要Semaphore。 64位类型的更大开销可能会令人惊讶,因此,如果开销可接受,则最好由.Net框架不允许它,并且如果使用更大的类型,则需要自己实现Semaphore。这导致我们调查volatile关键字的作用是什么。(请参见此页面)。 该页面在注释中声明:
嗯......在C#中,在字段上使用volatile修饰符保证对该字段的所有访问都使用VolatileRead或VolatileWrite。
VolatileRead
和VolatileWrite
都支持我们的64位类型!! 那么,我的问题是,为什么在 C#
中,System.Double
和 System.Int64
类型等不允许使用 volatile
关键字呢?