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?