ZBLOG

#include #include template class LockFreeQueue { public: LockFreeQueue() : head_(new Node), tail_(head_.load()) {} ~LockFreeQueue() { while (Node *const old_head = head_) { ...

这个错误是因为在调用std::atomic<Node*>::compare_exchange_weak函数时,参数的类型没有完全匹配。具体来说,old_headnew_head都是Node* const类型,但是compare_exchange_weak函数要求这两个参数都是指向非常量的指针。

解决这个问题的方法很简单,只需要将old_headnew_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

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1532

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?