#include <atomic>
template<typename T>
class List {
public:
void append(const T& value); // see below
private:
struct Node {
T data;
Node *next;
};
std::atomic<Node*> head;
};
template<typename T>
void List<T>::append(const T& value)
{
Node *newNode = new Node { value };
Node* headNode;
do {
headNode = head;
newNode->next = head;
} while (!std::atomic_compare_exchange_weak(&head, &headNode, newNode));
// or while (!head.compare_exchange_weak(headNode, newNode));
}
int main()
{
List<int> li;
li.append(10);
}
I2luY2x1ZGUgPGF0b21pYz4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIExpc3QgewpwdWJsaWM6CiAgdm9pZCBhcHBlbmQoY29uc3QgVCYgdmFsdWUpOyAgIC8vIHNlZSBiZWxvdwoKcHJpdmF0ZToKICBzdHJ1Y3QgTm9kZSB7IAogICAgVCBkYXRhOwogICAgTm9kZSAqbmV4dDsgCiAgfTsgIAoKICBzdGQ6OmF0b21pYzxOb2RlKj4gaGVhZDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgTGlzdDxUPjo6YXBwZW5kKGNvbnN0IFQmIHZhbHVlKQp7CiAgTm9kZSAqbmV3Tm9kZSA9IG5ldyBOb2RlIHsgdmFsdWUgfTsKICAgIAogIE5vZGUqIGhlYWROb2RlOwogIGRvIHsKICAgIGhlYWROb2RlID0gaGVhZDsKICAgIG5ld05vZGUtPm5leHQgPSBoZWFkOwogIH0gd2hpbGUgKCFzdGQ6OmF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoJmhlYWQsICZoZWFkTm9kZSwgbmV3Tm9kZSkpOwogIC8vIG9yIHdoaWxlICghaGVhZC5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoaGVhZE5vZGUsIG5ld05vZGUpKTsKfQoKaW50IG1haW4oKQp7CiAgTGlzdDxpbnQ+IGxpOwogIGxpLmFwcGVuZCgxMCk7Cn0K