ZBLOG

无锁队列 最大元素数校验代码

下面是一个简单的无锁队列的最大元素数校验代码示例:

#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;
    std::atomic<int> count;

public:
    LockFreeQueue() : head(nullptr), tail(nullptr), count(0) {}

    void push(const T& value) {
        Node* newNode = new Node(value);
        newNode->next = nullptr;

        Node* prevTail = tail.exchange(newNode, std::memory_order_acq_rel);
        if (prevTail != nullptr)
            prevTail->next = newNode;

        count.fetch_add(1, std::memory_order_release);
    }

    bool pop(T& value) {
        if (head == nullptr)
            return false;

        Node* oldHead = head.load(std::memory_order_acquire);
        Node* newHead = oldHead->next;
        
        if (newHead == nullptr)
            return false;

        value = newHead->data;
        
        head.store(newHead, std::memory_order_release);

        delete oldHead;

        count.fetch_sub(1, std::memory_order_release);

        return true;
    }

    int size() const {
        return count.load(std::memory_order_relaxed);
    }
};

该代码实现了一个基于CAS(Compare-And-Swap)操作的无锁队列。通过原子操作保证数据的一致性,避免使用互斥锁带来的开销,并且支持并发环境下的线程安全操作。

你可以根据需要使用该无锁队列类,并调用 push 方法将元素入队,调用 pop 方法将元素出队,并可使用 size 方法获取当前队列中的元素个数。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?