struct node_t
{
std::atomic<node_t*> next;
T data;
};
struct stack_t
{
std::atomic<node_t*> head;
};
void push(stack_t* stack, node_t* node)
{
node_t* cmp = stack->head.load(std::memory_order_relaxed);
do node->next.store(cmp, std::memory_order_relaxed);
while (!stack->head.compare_exchange_weak(cmp, node, std::memory_order_release));
}
node_t* pop(stack_t* stack)
{
node_t* node = stack->head.load(std::memory_order_consume);
for (;;)
{
if (node == 0)
break;
// (***)
node_t* next = node->next.load(std::memory_order_relaxed);
if (stack->head.compare_exchange_weak(node, next, std::memory_order_release))
break;
}
return node;
}