#include #include template class lock_free_stack { private: std::atomic threads_in_pop; void try_reclaim(node* old_head); public: std::shared_ptr pop() { ++threads_in_pop; node* old_head=head.load(); while(old_head && !head.compare_exchange_weak(old_head,old_head->next)); std::shared_ptr res; if(old_head) { res.swap(old_head->data); } try_reclaim(old_head); return res; } };