这个错误是因为在调用std::atomic<Node*>::compare_exchange_weak
函数时,参数的类型没有完全匹配。具体来说,old_head
和new_head
都是Node* const
类型,但是compare_exchange_weak
函数要求这两个参数都是指向非常量的指针。
解决这个问题的方法很简单,只需要将old_head
和new_head
的类型声明中的const
关键字去掉即可:
Node *old_head = head_.load(std::memory_order_relaxed);
Node *new_head = old_head->next_.load(std::memory_order_relaxed);
if (!new_head)
{
return false;
}
value = new_head->value_;
if (head_.compare_exchange_weak(old_head, new_head, std::memory_order_release,std::memory_order_relaxed))
{
size_.fetch_sub(1, std::memory_order_release);
delete old_head;
return true;
}
return false;
注意,在这里不需要使用std::atomic_load_explicit
函数,可以直接使用load
成员函数进行加载操作,因为我们只需要保证节点指针的原子性,而不需要保证节点本身的原子性。同时,由于在比较交换操作中涉及到了对节点的删除操作,所以需要将内存序设置为std::memory_order_release
。