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

《C++ Concurrency in Action》无锁栈清除next指针必要性疑问

关于无锁栈中清除弹出节点next指针的必要性

你的观点不正确,必须保留std::atomic_store(&old_head->next, std::shared_ptr<node>());这行代码,核心原因如下:

  • 你提到的“next节点仍被其他shared_ptr持有”没错,但问题的关键不是节点被误销毁,而是要避免集中式的深层嵌套析构。
  • 举个例子:假设栈里有一长串节点A->B->C->...->Z。线程弹出A后,head被更新为B,此时A->next还指向B。如果不清空这个指针,当持有A的局部shared_ptr(old_head)销毁时,会先析构A的next成员——这会让B的引用计数减1。如果此时B的引用计数刚好降到0(比如其他线程已经弹出B,且head已经更新到C,没有其他引用持有B),那么B会被销毁,进而触发B->next(指向C)的析构,以此类推,形成一条连续的析构链。
  • 这种集中式的析构会在单个线程内造成长时间阻塞,甚至可能因析构链过长导致栈溢出(尤其是节点嵌套较深的场景)。而清空弹出节点的next指针后,每个节点的析构只会处理自身,后续节点的析构会由持有它们的shared_ptr(比如head或其他线程的局部变量)分散完成,避免了单线程的集中开销。
  • 额外提一句:atomic_store确保了next指针的修改是原子操作,避免其他线程读取该指针时看到不一致的中间状态,保证了线程安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:40