![]() |
1
3
只有当写入是原子的,这是有保证的 with unaligned qword writes on Intel as long as it doesn't span a cache-line boundary ,但AMD不能保证。最低公分母原子性保证是8字节对齐的存储是原子的,仅此而已。
使用
或者,如果您的CPU支持AVX,16字节对齐的SSE/AVX存储保证在带有AVX的CPU上实现原子存储。(经过多年的实践证明,这基本上是安全的,但幸运的是,它可以追溯到所有AVX CPU,没有新的功能位。)所以,如果你能让常数对齐,不跨越16字节的边界,你可以这样更新它。(用自身覆盖周围的字节不会导致问题,除非另一个线程也在附近更新另一个常量。)
如果性能对这一点很重要(例如,每分钟做一次以上),那么可能值得使用一些填充或NOP来对齐常量8字节,尤其是如果可以的话
just lengthen earlier instructions
不需要真正的NOP,甚至
不 完全概括为替换多个指令
但如果你尊重这个限制,交叉修改代码是非常安全的。我认为Windows热补丁会让其他可能正在运行代码的线程停止运行,但我不知道为什么,因为它已经确保有一条足够大的指令可以覆盖。要么是他们过于谨慎,要么是代码获取不尊重存储原子性存在一些我不知道的风险。也许只是他们不想在函数未对齐的情况下依赖于2字节存储原子性,甚至认为这是默认的,因为正常的编译器设置有不同的原因。 |
|
Anon. · 用汇编语言解释这一行? 6 年前 |
![]() |
wangt13 · 如何使用VMX暂停和恢复VM 6 年前 |
![]() |
Kay · Skylake和更新的环形巴士 7 年前 |
![]() |
Kadir · Intel芯片上的半精度浮点算法 7 年前 |
![]() |
Some_Dude · x86汇编牛顿平方根算法寄存器为1#IND 7 年前 |