以下是一个简单的C++实现无锁队列的示例:
#include <atomic>
template <typename T>
class LockFreeQueue {
private:
struct Node {
T data;
Node* next;
Node(const T& value) : data(value), next(nullptr) {}
};
std::atomic<Node*> head;
std::atomic<Node*> tail;
public:
LockFreeQueue() : head(nullptr), tail(nullptr) {}
~LockFreeQueue() {
while (Node* current = head.load()) {
head.store(current->next);
delete current;
}
}
void enqueue(const T& value) {
Node* newNode = new Node(value);
newNode->next = nullptr;
// 使用原子操作更新tail指针
Node* prevTail = tail.exchange(newNode);
// 更新之前的尾节点的next指针
if (prevTail != nullptr)
prevTail->next = newNode;
// 如果之前的尾节点为空,表示队列为空,需要更新头指针
else
head.store(newNode);
}
bool dequeue(T& result) {
Node* oldHead = head.load();
if (oldHead == nullptr)
return false;
// 更新head指针为下一个节点
head.store(oldHead->next);
result = oldHead->data;
delete oldHead;
return true;
}
};
这只是一个简单示例,实际应用中可能需要更复杂的逻辑和保证线程安全性。另外,请注意无锁编程需要特定硬件支持,不同平台或编译器可能有不同的行为。因此,在使用无锁队列时,请确保仔细测试和评估其性能和正确性。
内容由零声教学AI助手提供,问题来源于学员提问