You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅通过一次原子变量写入实现多线程向列表添加元素?

多线程无锁列表插入的原子实现方案

确实可以通过一次原子写入实现多线程向链表添加元素,你提出的「用指针作为原子变量的链表」思路完全正确,这是经典无锁链表(Lock-Free Linked List)的核心实现逻辑之一。

具体实现逻辑

无锁链表的头节点通常使用原子指针(比如C++中的std::atomic<T*>)。线程插入新节点时:

  • 先创建新节点,将新节点的next指针指向当前头节点原子变量的即时值
  • 调用原子的compare_exchange_weak(或compare_exchange_strong)操作,尝试将头节点的原子指针从刚才读取的旧值更新为新节点地址
  • 如果CAS(比较并交换)操作成功,插入完成;若失败(说明其他线程已修改头节点),则重新读取头节点最新值,重复上述步骤

整个流程中,**仅需一次成功的原子写入(CAS属于原子读-改-写操作,归类为单个原子指令)**即可完成元素添加,无需mutex或额外的atomic flag。

关于动态数组的结论

你判断「连续内存的动态数组无法仅通过一次原子写入实现多线程安全添加」是对的,原因如下:

  • 动态数组扩容需要重新分配内存、拷贝旧数据,这个过程无法通过单个原子操作完成
  • 即使不扩容,添加元素需要同时更新数组长度计数器和写入元素到对应位置,这两个操作无法合并为一次原子写入,必须同步保护,否则会出现数据竞争(比如一个线程在写元素时,另一个线程已更新长度导致访问越界)

额外注意点

无锁链表实现需要处理ABA问题(比如头节点被其他线程删除后又重新添加,导致CAS操作误判),通常可以用「原子指针+版本号」的组合(比如std::atomic<std::pair<T*, size_t>>)来解决。


内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:12:02