2016 - 2024

感恩一路有你

c++队列 多线程编程的时候,使用无锁结构会不会比有锁结构更加快?

浏览量:1728 时间:2021-03-16 04:05:26 作者:admin

多线程编程的时候,使用无锁结构会不会比有锁结构更加快?

这是毫无疑问的,因为线程锁定是资源密集型的

!那么,如何避免锁的性能下降呢?

1、从业务上避免大量锁结构

!2. 使用ThreadLocal,可以保证每个线程中的数据不会互相污染

!3. 如果读多写少,请使用读写锁

!4. 自旋锁将挑战CPU,尽管它是一个线程时间很少的锁

!5. 锁的粒度应该尽可能小:如果锁可以在方法中,就不应该占用整个方法

当前的无锁设计得益于CPU对CAS操作的支持。因此,如果您想了解无锁设计,您应该首先了解什么是CAS。

CAS是compare and swap的缩写,中文翻译为“compare and exchange”。它的实现如下:有三个操作数,内存值V、旧的期望值a和要修改的新值B。当且仅当期望值与内存值相同时,将内存值V更改为B,否则将不执行任何操作。

下面是一个解释CAS算法的示例。假设有两个线程T1和T2同时访问同一变量10。因此,他们会将主内存的值复制到自己的工作内存空间中,因此T1和T2线程的预期值是10。

假设T1和T2竞争时,T1成功地将变量值更改为11,然后将其写入内存。发现T2的更新值与T10的期望值不一致。

CAS操作类似于提交重试模式。当同步冲突发生的几率较小时,系统的性能会有很大的提高。

虽然CAS有效地解决了原子操作问题,但仍然存在三个问题:ABA问题、spin-CAS循环时间长、开销大、一个CAS只能保证一个变量的原子操作。针对这三个问题,不同的语言给出了解决方案。如果您想了解更多,可以查询您关注的解决方案。

由于缺乏硬件知识,如果您想知道CPU是如何实现的,可以查看CPU的相关信息。

c++队列 dpdk无锁队列 无锁队列实现原理

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。