#ifndef shared_ptr_h #define shared_ptr_h #include #include #include template class stack { public: ~stack() { while (pop()); } void push(T t) { auto p = std::make_shared(head.load(std::memory_order_relaxed), std::move(t)); while (!head.compare_exchange_weak( p->next, p, std::memory_order_release, std::memory_order_relaxed)); } std::optional pop() { auto p = head.load(std::memory_order_acquire); while (p && !head.compare_exchange_weak(p, p->next, std::memory_order_release, std::memory_order_relaxed)); if (p) return std::optional(std::move(p->data)); else return std::nullopt; } private: struct node { std::shared_ptr next; T data; }; std::atomic> head = nullptr; // NO LOCKFREE!!! // static_assert(std::atomic>::is_always_lock_free, // "std::atomic> is not lock-free!"); }; #endif // shared_ptr_h