贴的第一个代码不对,贴的第二个跟链接里的代码是对的。原因上面 @
piaodazhu @
C47CH 说了,虽然重复我也说一下。
贴的第一个:
- head 已经在 compare exchange 修改了,不过 new_node 的 next 没设置,导致断了
- 用 compare_exchange_weak 就好,不过我不确定你用的 memory order 对不对
- 这里 length 更新会比实际慢,所以会有差异
- while 里的 old_head = head.load(std::memory_order_release); 除了第一次有用外,没什么用,应该放在 do 上面
贴的第二个,解答你的问题。
如果线程 A 如果执行到 @
2 被休眠,如果其他 push 线程 直接执行 @
2 ,@3 修改了 head atomic 值,线程 A 不就一直卡死了吗?
不会卡死,因为 compare_exchange_weak 会失败,同时会设置 new_node->next 的值。所以是对的。
4L 你的问题:new_node->next = old_head 放到 while 循环里后逻辑是对的。其它问题参考上面的问题列表