无锁编程:C++无锁stack

https://en.cppreference.com/w/cpp/atomic/memory_order

 

stack.h

#include <atomic>
using namespace std;

template<typename T>
class stack
{
    template<typename D>
        struct node
        {
            D data;
            node* next;
            node(const D& data):data(data), next(nullptr){}
        };

    std::atomic<node<T>*> head;
public:
    stack():head(nullptr){}

    void push(const T& data)
    {
        node<T>* new_node = new node<T>(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 try_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 != nullptr)
        {
            data = result->data;
            return true;
        }
        else
        {
            return false;
        }

    }
};

 

main.cpp 创建2个push线程,2个pop线程

#include <iostream>
#include "stack.h"
#include <thread>
using namespace std;

stack<int> s;

std::atomic<int> count(0);
const int Max = 10000;

void do_push()
{
    for(int i=0;i<Max;++i)
    {
        s.push(i);
    }
}

void do_pop()
{
    while(count != Max *2)
    {
        int out = 0;
        while (s.try_pop(out))
        {
            cout<<"pop:"<<out<<",count:"<<++count<<endl;
        }
    }
}

int main()
{
    std::thread t1(do_push);
    std::thread t2(do_push);
    std::thread t3(do_pop);
    std::thread t4(do_pop);
    t1.join();
    cout<<"quit t1"<<endl;
    t2.join();
    cout<<"quit t2"<<endl;
    t3.join();
    cout<<"quit t3"<<endl;
    t4.join();
    cout<<"quit t4"<<endl;
    return 0;
}

编译命令

g++ --std=c++11 -g main.cpp -o main -pthread

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值