На странице cppreference atomic_compare_exchange было показано, что существующие реализации std::atomic_compare_exchange_weak
вычисляют логический результат CAS с неатомным сравнением инструкция, например
lock
cmpxchgq %rcx, (%rsp)
cmpq %rdx, %rax
который (Edit: извинения за красную селедку)
Разбить CAS-контуры, такие как Concurrency в списке действий 7.2:
while(!head.compare_exchange_weak(new_node->next, new_node);
Спецификация (29.6.5 [atomics.types.operations.req]/21-22), по-видимому, подразумевает, что результат сравнения должен быть частью атомной операции:
Эффекты: атомарно сравниваются...
Возвращает: результат сравнения
но действительно ли это возможно? Должны ли мы сообщать об ошибках поставщикам или LWG?