#include
using namespace std;
template
class stack
{
template
struct node
{
D data;
node* next;
node(const D& data):data(data),next(nullptr){}
};
std::atomic
public:
stack():head(nullptr){}
void push(const T& data)
{
node
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
std::atomic
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 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。