ZBLOG

给出基于原子操作 mpscqueue 的 c++ 代码

以下是一个基于原子操作(atomic operations)的 MPSC 队列 C++ 代码示例:

#include <atomic>

template<typename T>
class mpscqueue {
 private:
  struct Node {
    T value;
    std::atomic<Node*> next{nullptr};
  };

  std::atomic<Node*> head_{nullptr};
  std::atomic<Node*> tail_{nullptr};

 public:
  void enqueue(const T& value) {
    auto node = new Node{value, nullptr};

    Node* prev_tail = tail_.exchange(node, std::memory_order_acq_rel);
    if (prev_tail != nullptr) {
      prev_tail->next.store(node, std::memory_order_release);
    } else {
      head_.store(node, std::memory_order_release);
    }
  }

  bool dequeue(T& result) {
    Node* current_head = head_.load(std::memory_order_acquire);
    if (current_head == nullptr) return false;

    result = current_head->value;
    head_.store(current_head->next.load(std::memory_order_acquire), std::memory_order_release);

    delete current_head;
    return true;
  }
};

该示例中使用了 std::atomic 来管理队列头尾节点,同时使用了 std::memory_order 枚举来控制内存访问顺序。在生产者线程中,使用原子操作将新节点插入到队列尾部,并更新 tail 指针;在消费者线程中,首先读取当前的头节点,然后使用原子操作将头指针指向下一个节点,并删除旧的头节点。

需要注意的是,在 MPSC 队列中,由于只有单个消费者线程,因此无需考虑多个线程之间的竞争问题。但需要确保在队列操作中使用适当的内存屏障,以确保正确的顺序访问节点指针和值。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?