无锁消息队列是一种多线程通信机制,用于在线程间高效地传递消息而不使用互斥锁。它常用于需要高性能、低延迟的并发应用中。
以下是一个简单的无锁消息队列的示例代码(使用C++11原子操作):
#include <atomic>
#include <vector>
template<typename T>
class LockFreeQueue {
public:
LockFreeQueue() : head_(nullptr), tail_(nullptr) {}
void push(const T& value) {
Node* node = new Node(value);
Node* prevTail = tail_.exchange(node, std::memory_order_acq_rel);
if (prevTail != nullptr) {
prevTail->next.store(node, std::memory_order_release);
} else {
head_ = node;
}
}
bool pop(T& value) {
Node* currentHead = head_.load(std::memory_order_acquire);
if (currentHead == nullptr) {
return false; // 队列为空
}
head_ = currentHead->next.load(std::memory_order_acquire);
value = currentHead->data;
delete currentHead;
return true;
}
private:
struct Node {
T data;
std::atomic<Node*> next;
explicit Node(const T& value) : data(value), next(nullptr) {}
};
std::atomic<Node*> head_;
std::atomic<Node*> tail_;
};
这个无锁消息队列使用两个原子指针来跟踪头部和尾部节点,每个节点包含数据和一个指向下一个节点的原子指针。push()操作使用std::atomic::exchange()来原子地更新尾部指针,并将新节点链接到旧尾部节点的next指针上。而pop()操作则通过读取头部指针,并原子地更新头部和释放旧的头部节点,来实现出队列并返回数据。
请注意,这个示例只是一个简单的无锁消息队列的实现,并没有处理其他复杂情况(如内存管理、并发冲突等)。在实际应用中,需要根据具体需求进行适当的改进和扩展。
内容由零声教学AI助手提供,问题来源于学员提问




