C++无锁栈的实现

#include <atomic>
#include <string>
#include <iostream>


template<typename T>
class tg_stack
{
public:
    tg_stack():_head(nullptr)
    {
    }

    void push(const T& data)
    {
        node* new_node = new node(data);
        new_node->next = _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& data)
    {
        auto result = _head.load(std::memory_order_relaxed);
        while( result != nullptr && !_head.compare_exchange_weak(result,result->next,
                                                                std::memory_order_release,
                                                                std::memory_order_relaxed));
        if( !result )
        {
            return false;
        }
        data = result->data;

        delete result;
        return true;
    }

private:
    struct node
    {
        T data;
        node* next;

        node(const T& data) : data(data), next(nullptr) {}
    };
    std::atomic<node*> _head;
};

struct node
{
    int data;

    node(const int& data) : data(data){}
};
int main()
{
    tg_stack<int> st;
    tg_stack<node> st2;
    for (int i=0; i<10; i++)
    {
        st.push(i);
        node jj(i);
        st2.push(jj);
    }

    for (int i=0; i<11; i++)
    {
        int kk=-1;
        node jj(-2);
        st.pop(kk);
        st2.pop(jj);
        std::cout <<  kk << " : " <<jj.data <<std::endl;
    }

    return 0;
}

结果:

9 : 9
8 : 8
7 : 7
6 : 6
5 : 5
4 : 4
3 : 3
2 : 2
1 : 1
0 : 0
-1 : -2

猜你喜欢

转载自blog.csdn.net/f110300641/article/details/83689054