void Stack::push(int val) { StackHead expected = head.load(); StackItem *newItem = new StackItem(val); StackHead newHead; newHead.link = newItem; do { newItem->next = expected.link; newHead.count = expected.count + 1; } while (!head.compare_exchange_weak(expected, newHead)); }