以下是一个基于原子操作(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 队列中,由于只有单个消费者线程,因此无需考虑多个线程之间的竞争问题。但需要确保在队列操作中使用适当的内存屏障,以确保正确的顺序访问节点指针和值。




