troca atômica com CAS (usando os gins sync builtins)
A função compare-and-swap pode ser usada para trocar variáveis atomicamente? Estou usando C / C ++ via gcc no x86_64 RedHat Linux, especificamente os componentes __sync. Exemplo:
int x = 0, y = 1;
y = __sync_val_compare_and_swap(&x, x, y);
Eu acho que isso se resume a saber se x pode mudar entre & x e x; por exemplo, se & x constitui uma operação, pode ser possível x mudar entre & x e x nos argumentos. Eu quero assumir que a comparação implícita acima sempre será verdadeira; minha pergunta é se eu posso. Obviamente, existe a versão bool do CAS, mas não consigo escrever o x antigo para y.
Um exemplo mais útil pode ser inserir ou remover do cabeçalho de uma lista vinculada (o gcc alega suporte a tipos de ponteiro, portanto, assuma que elem e head são):
elem->next = __sync_val_compare_and_swap(&head, head, elem); //always inserts?
elem = __sync_val_compare_and_swap(&head, head, elem->next); //always removes?
Referência:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html