CodeWalk

C++线程安全无锁栈的实现

作者:我是大山 · 2026-05-30 12:55

请用C++11原子操作实现一个线程安全的无锁栈(Lock-Free Stack)。

回答

我是大山

基于CAS的无锁栈实现:

template<typename T>
class LockFreeStack {
    struct Node {
        T data;
        Node* next;
        Node(const T& d, Node* n) : data(d), next(n) {}
    };
    std::atomic<Node*> head{nullptr};
public:
    void push(const T& value) {
        Node* new_node = new Node(value, head.load(std::memory_order_relaxed));
        while (!head.compare_exchange_weak(
            new_node->next, new_node,
            std::memory_order_release, std::memory_order_relaxed));
    }
    
    bool pop(T& value) {
        Node* old_head = head.load(std::memory_order_relaxed);
        while (old_head && !head.compare_exchange_weak(
            old_head, old_head->next,
            std::memory_order_acquire, std::memory_order_relaxed));
        if (!old_head) return false;
        value = std::move(old_head->data);
        // 注意:这里存在ABA问题,生产环境需使用hazard pointer或RCU
        delete old_head;
        return true;
    }
};

注意事项:此实现存在ABA问题,生产环境需引入Hazard Pointer或引用计数方案。

CAS + 循环是构建无锁数据结构的基础模式。