#include #include template class lock_free_stack { private: struct node { std::shared_ptr data; node* next; node(T const& data_): data(std::make_shared(data_)) {} }; std::atomic head; public: void push(T const& data) { node* const new_node=new node(data); new_node->next=head.load(); while(!head.compare_exchange_weak(new_node->next,new_node)); } std::shared_ptr pop() { node* old_head=head.load(); while(old_head && !head.compare_exchange_weak(old_head,old_head->next)); return old_head ? old_head->data : std::shared_ptr(); } };