无锁编程:C++无锁stack

#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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...