以下是一个简单的无锁队列(lock-free queue)的示例代码,使用了原子操作来保证线程安全性。这个示例使用 C++11 的原子操作库。
#include <atomic>
#include <memory>
template<typename T>
class LockFreeQueue {
private:
struct Node {
std::shared_ptr<T> data;
Node* next;
Node(const T& value) : data(std::make_shared<T>(value)), next(nullptr) {}
};
std::atomic<Node*> head;
std::atomic<Node*> tail;
public:
LockFreeQueue() : head(new Node(T())), tail(head.load()) {}
~LockFreeQueue() {
while (head != nullptr) {
Node* temp = head;
head = temp->next;
delete temp;
}
}
void enqueue(const T& value) {
Node* newNode = new Node(value);
// 在尾部插入新节点
tail.load()->next = newNode;
tail.store(newNode);
}
bool dequeue(T& result) {
// 如果队列为空,返回false
if (head.load() == nullptr)
return false;
// 从头部删除节点并获取数据
result = *(head.load()->data);
// 更新头部指针
Node* oldHead = head.exchange(head.load()->next);
// 删除旧头部节点
delete oldHead;
return true;
}
};
请注意,这只是一个基本示例,可能还需要进行更多的测试和改进以满足实际需求。无锁编程是一项复杂而容易出错的任务,请确保在实际使用时进行充分的测试和验证。
内容由零声教学AI助手提供,问题来源于学员提问