#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(); } };