#include #include std::shared_ptr pop() { std::atomic& hp = get_hazard_pointer_for_current_thread(); node* old_head = head.load(); do { node* temp; do { temp = old_head; hp.store(old_head); old_head = head.load(); } while (old_head != temp); } while (old_head && !head.compare_exchange_strong(old_head, old_head->next)); hp.store(nullptr); std::shared_ptr res; if (old_head) { res.swap(old_head->data); if (outstanding_hazard_pointers_for(old_head)) { reclaim_later(old_head); } else { delete old_head; } delete_nodes_with_no_hazards(); } return res; }