加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

无锁编程:C++无锁stack

发布时间:2020-12-15 04:47:16 所属栏目:百科 来源:网络整理
导读:#include using namespace std; template class stack { template struct node { D data; node* next; node(const D data):data(data),next(nullptr){} }; std::atomic *> head; public: stack():head(nullptr){} void push(const T data) { node * new_node

#include

using namespace std;

template

class stack

{

template

struct node

{

D data;

node* next;

node(const D& data):data(data),next(nullptr){}

};

std::atomic*> head;

public:

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 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_relaxed));

if (result != nullptr)

{

data = result->data;

return true;

}

else

{

return false;

}

}

};

stack.h

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

#include

#include "stack.h"

#include

using namespace std;

stack s;

std::atomic count(0);

const int Max = 10000;

void do_push()

{

for(int i=0;i

{

s.push(i);

}

}

void do_pop()

{

while(count != Max *2)

{

int out = 0;

while (s.try_pop(out))

{

cout<<"pop:"<

}

}

}

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"<

t2.join();

cout<<"quit t2"<

t3.join();

cout<<"quit t3"<

t4.join();

cout<<"quit t4"<

return 0;

}

编译命令

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读