当前位置: 首页 > 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 提供成熟的无锁数据结构(队列、哈希表等)

相关文章:

  • 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
  • 做教案比较好的网站/网址怎么推广
  • 天津网站建设wangzhii/链爱交易平台
  • 石家庄 科技 公司 网站建设/世界军事新闻
  • 党支部建设网站/产品推广文案怎么写
  • 超炫html5网站模板/提升关键词排名软件哪家好
  • 真人做爰直播视频网站/网站排名系统