无锁编程: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 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |