大佬教程收集整理的这篇文章主要介绍了c – 在x64 CPU上读取原子16字节,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
现在的问题是对齐16个字节的值,只有使用cmpxchg16(它的行为就像一个完整的内存屏障)才能修改,是否有可能读取一半的旧数据和一半的新数据的16位元的位置?
只要我用SSE指令读取(所以线程在读取的中间不能中断),我认为这是不可能的(即使在多处理器numa系统中)读取看到不一致的数据.我认为它必须是原子的.
我假设当执行cmpxchg16时,它以原子方式修改16个字节,而不是通过写入两个8字节的块,其中有可能为其他线程进行读取(老实说,我看不出它可以如何工作不是原子的)
我对吗?如果我错了,有没有办法做一个原子16字节读取而不诉诸锁定?
注意:有一个couple similar questions here,但是他们没有处理只用cmpxchg16完成写入的情况,所以我觉得这是一个单独的,未回答的问题.
编辑:其实我认为我的推理是错误的. SSE加载指令可以被执行为两个64位读取,并且可以通过另一个处理器在两次读取之间执行cmpxchg16.
这应该够了吧. typedef确保正确的对齐. cmpxchg16b需要在16字节边界上对齐数据.
cmpxchg16b将测试* src是否包含零,如果是(nop)则写入零.在任一情况下,正确的值将在RAX:RDX之后.
上面的代码评估为一样简单
@H_673_18@push %rbx xor %rax,%rax xor %rbx,%rbx xor %rcx,%rcx xor %rdx,%rdx lock cmpxchg16b (%rdi) pop %rbx retq以上是大佬教程为你收集整理的c – 在x64 CPU上读取原子16字节全部内容,希望文章能够帮你解决c – 在x64 CPU上读取原子16字节所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。