O std :: atomic_compare_exchange_weak é inseguro por design?

Foi criado emcppreference atomic_compare_exchange Página de discussão que as implementações existentes dostd::atomic_compare_exchange_weak calcular o resultado booleano do CAS com uma instrução de comparação não atômica, por exemplo

    lock
    cmpxchgq   %rcx, (%rsp)
    cmpq       %rdx, %rax

qual (Edit: desculpas pelo arenque vermelho)

quebre os loops do CAS, como a listagem 7.2 da Concurrency in Action:

while(!head.compare_exchange_weak(new_node->next, new_node);

A especificação (29.6.5 [atomics.types.operations.req] / 21-22) parece implicar que o resultado da comparação deve fazer parte da operação atômica:

Efeitos: compara atomicamente ...

Retorna: o resultado da comparação

mas é realmente implementável? Devemos arquivar relatórios de erros aos fornecedores ou ao LWG?

questionAnswers(5)

yourAnswerToTheQuestion