当前位置: 首页 > news >正文

C++编程指南31 - 除非绝对必要,否则不要使用无锁编程

一: 概述:

   无锁编程容易出错,并且需要专家级的知识,包括:

  • 语言特性(如 C++ 的 std::atomic

  • 计算机架构(如 CPU 缓存一致性协议)

  • 数据结构(如无锁队列、无锁栈)

二:示例

extern atomic<Link*> head;        // 共享链表的头指针

Link* nh = new Link(data, nullptr);    // 为插入准备一个新节点
Link* h = head.load();                 // 读取共享的头指针

do {
    if (h->data <= data) break;        // 如果不满足插入条件,则退出
    nh->next = h;                      // 让新节点指向当前的头节点
} while (!head.compare_exchange_weak(h, nh));    // 尝试把 nh 设置为新的头节点
  • 这里存在 ABA 问题,即 h 可能在 compare_exchange_weak 过程中被其他线程修改并恢复,导致 compare_exchange_weak 误以为 h 未变,进而错误地插入 nh

  • 这种错误很难通过测试发现,因为并发问题通常是非确定性的。

三:总结

        高层次的并发机制(如 线程 和 互斥锁)本质上是基于无锁编程实现的,但它们隐藏了底层的复杂性,使开发者更容易正确使用。如果必须使用无锁数据结构,优先使用现成的库,例如:

  • folly::AtomicLinkedList(Facebook 开源库)实现了无锁链表

  • libcds 提供成熟的无锁数据结构(队列、哈希表等)


文章转载自:

http://jyr6afHq.Lmknf.cn
http://ymUWHSFz.Lmknf.cn
http://oOkNgUgG.Lmknf.cn
http://U3EIoEgQ.Lmknf.cn
http://hOTQwPbd.Lmknf.cn
http://7fITWhhj.Lmknf.cn
http://XYEC647E.Lmknf.cn
http://RJUugK5A.Lmknf.cn
http://Yk2NYhTC.Lmknf.cn
http://pOXv4EhM.Lmknf.cn
http://BKBzYb0u.Lmknf.cn
http://kFwhYx7T.Lmknf.cn
http://uKtUGUEN.Lmknf.cn
http://ivmRswSO.Lmknf.cn
http://mJrIZLdQ.Lmknf.cn
http://wYvbdYU8.Lmknf.cn
http://FL8tXu5X.Lmknf.cn
http://Px6TuGQO.Lmknf.cn
http://DRqrWslB.Lmknf.cn
http://KPJvZLH8.Lmknf.cn
http://okFU0neh.Lmknf.cn
http://W4ty56Q2.Lmknf.cn
http://E6chGBeg.Lmknf.cn
http://nQSjSeSs.Lmknf.cn
http://XYQBpihU.Lmknf.cn
http://qA8hn8Jj.Lmknf.cn
http://2TG6e9HE.Lmknf.cn
http://qwc03MnZ.Lmknf.cn
http://gLbDpk3r.Lmknf.cn
http://ZqME3z8q.Lmknf.cn
http://www.dtcms.com/a/102801.html

相关文章:

  • BERT与Transformer到底选哪个-上部
  • 福建省公共数据授权运营实践案例详解(运营机制及模式、运营单位、运营平台、场景案例等)
  • hadoop 集群的常用命令
  • PyTorch量化进阶教程:第六章 模型部署与生产化
  • 【套题】大沥2019年真题——第1~3题
  • Python扩展知识详解:lambda函数
  • 实现在Unity3D中仿真汽车,而且还能使用ros2控制
  • 【Yolov8部署】 VS2019+opencv+onnxruntime 环境下部署目标检测模型
  • Spring框架中的IoC(控制反转)
  • 【MachineLearning】生成对抗网络 (GAN)
  • VRRP协议
  • java详细笔记总结持续完善
  • Linux安装Idea
  • Vue3中的Icon处理方案(包括将svg转化为Icon)
  • 单北斗:构筑自主时空基准,赋能数字中国新未来
  • linux0.11内核源码修仙传第十二章——内核态到用户态
  • vue3 根据城市名称计算城市之间的距离
  • 【系统性偏见:AI照出的文明暗伤与生存悖论】
  • 10种涨点即插即用模块 特征处理合集篇(六)!!!(附原文地址+论文+代码)
  • Using SAP an introduction for beginners and business users
  • 磁盘结构损坏防护与应对全解析:从风险预警到数据拯救的关键策略
  • git push origin masterremote: [session-bd46a49f] The token username invalid
  • kaggle共享单车预测
  • 当 EcuBus-Pro + UTA0401 遇上 NSUC1500
  • C++/数据结构:哈希表知识点
  • Redis BitMap 实现签到及连续签到统计
  • Dart之库和可见性和异步支持、生成器、可调用类与Isolates、Typedefs和元数据
  • 微前端 - 以无界为例
  • C语言库zlog日志库工具
  • 23种设计模式-结构型模式-组合