C++ x86cpu上的比较与交换
例如,在intel i3、i5、i7 x86 64位cpu上,CAS是否只保证最大8字节对象大小的原子 在x86 cpu上,将lock指令添加到CAS操作中,例如,C++ x86cpu上的比较与交换,c++,multithreading,cas,lock-free,C++,Multithreading,Cas,Lock Free,例如,在intel i3、i5、i7 x86 64位cpu上,CAS是否只保证最大8字节对象大小的原子 在x86 cpu上,将lock指令添加到CAS操作中,例如,CMPXCHG,这意味着整个缓存线对于读取cpu是锁定的,因此std::atomic::compare\u exchange\u weak()不会因虚假故障原因返回故障 如果x86 cpu在CAS操作时使用lock,如果在共享资源上使用无锁编程而不是std::mutex,性能会有什么提高 例如,如果我想写一个无锁链表。我在头节点的指针
CMPXCHG
,这意味着整个缓存线对于读取cpu是锁定的,因此std::atomic::compare\u exchange\u weak()
不会因虚假故障原因返回故障
如果x86 cpu在CAS操作时使用lock
,如果在共享资源上使用无锁编程而不是std::mutex,性能会有什么提高
例如,如果我想写一个无锁链表。我在头节点的指针上执行原子加载,并将其与
std::atomic::compare\u exchange\u弱()
进行比较,以查看是否进行了任何更改。在这种情况下,ABA问题是否适用于x86 cpu?这里有几个问题:-)
CMPXCHG16b
指令支持16字节CA(通常称为双宽度CA)比较交换弱
和比较交换强
之间进行选择时,底层硬件实现是不相关的:如果您只是在编写一个典型的小型CAS循环,那么应该使用一个对您正在做的事情有意义的弱交换(对于虚假故障的额外工作可以忽略不计),以及一个强大的交换。这也使您的代码更具可移植性和健壮性std::mutex
是“足够好的”(实际上大部分时间性能都很好),但是如果在高争用情况下锁内有非常少量的工作,那么锁定开销确实会超过实际工作量,并且无锁算法可以显著提高吞吐量