Ron*_*ein 13 .net c# multithreading jit volatile
随着我越来越深入地阅读volatile关键字的含义,我不断对自己说"这是实现的方式,这不应该是高级编程语言的一部分".
我的意思是,CPU缓存数据的事实对于JIT编译器应该是有趣的,而不是C#程序员.
一个相当大的选择可能是一个属性(比方说VolatileAttribute).
你怎么看?
我认为你是侧面跟踪的.所有关于缓存等技术的东西都是尝试用低级术语解释它的一部分.volatile的功能描述是"我可能会被共享".鉴于默认情况下线程之间没有任何东西可以共享,这并不奇怪.而且我认为基本上足以保证属性上的关键字,但我认为它在很大程度上受到历史决策的影响(C++)
替换/优化它的一种方法是使用VolatileRead()和VolatileWrite()调用.但这更像是"实施".
嗯,我当然同意,这样的实现细节暴露是非常可怕的.然而,它与lock关键字所公开的完全相同.我们仍然远离该 bug生成器,从我们的代码中完全删除.
硬件人员有很多工作要做.volatile关键字对许多具有弱内存模型的CPU内核很重要.市场对他们并不友好,Alpha和Itanium表现不佳.不完全确定原因,但我怀疑为这些内核编写实线程代码的难度与它有很大关系.搞错是调试的噩梦.关于volatile的MSDN Library文档中的措辞适用于这些类型的处理器,否则它对于x86/x64内核来说是非常不合适的,并且使关键字的效果远远超过实际情况.Volatile仅防止变量值存储在这些核心上的CPU寄存器中.
不幸的是,在非常精选的情况下,volatile仍然在x86内核上很重要.我还没有找到任何证据表明它在x64核心上很重要.据我所知,并且SSCLI20中的源代码支持,Opcodes.Volatile指令是x64抖动的无操作,既不改变编译器状态也不改变任何机器代码.那是正确的方向.
通用建议是,无论您在考虑volatile,使用锁或其中一个同步类都应该是您的首要考虑因素.避免他们尝试优化您的代码是微观优化,当您的程序出现线程竞争问题时,您将失去的睡眠数量会失败.
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |