#include #include #include #include #include #include #include template struct QNode { std::unique_ptr payload; volatile std::atomic next; QNode() = default; explicit QNode(T&& payload): payload(std::forward(payload)) {} }; template class Queue { private: volatile std::atomic*> head; volatile std::atomic*> tail; public: void push(T&& payload) { QNode* node = new QNode(std::forward(payload)); node->next = node; QNode* _tail = tail; QNode* _next = _tail->next; do { node->next = _next; } while (!_tail->next.compare_exchange_weak(_next, node)); tail.compare_exchange_strong(_tail, node); } std::unique_ptr pop() { } };