Pergunta

Eu sei que em sistemas de MacOSX / POSIX, há atômica-compare-and-swap para o código C / C ++ via g ++.

No entanto, eu não preciso do comparar - Eu só quero atomicamente trocar dois valores. Existe uma operação de swap atômica disponíveis? [Everythign eu posso encontrar é atomic_compare_and_swap ... e eu só quero fazer o swap, sem comparar].

Obrigado!

Foi útil?

Solução

a instrução de montagem intel "bloqueio xchg" provavelmente consegue o que quiser, mas eu não acho que há uma função GCC wrapper para torná-lo portátil. Mesmos a sua presa usando linha de montagem (não portátil) ou utilizando comparar e trocar e forçando a comparar para ser verdade (ineficiente). Espero que isso ajude: -)

Outras dicas

GCC fornece esta operação em alguns processadores, sob a (confusamente chamado) __sync_lock_test_and_set. A partir da documentação GCC:

 This builtin, as described by Intel, is not a traditional
 test-and-set operation, but rather an atomic exchange operation.
 It writes VALUE into `*PTR', and returns the previous contents of
 `*PTR'.

 Many targets have only minimal support for such locks, and do not
 support a full exchange operation.  In this case, a target may
 support reduced functionality here by which the _only_ valid value
 to store is the immediate constant 1.  The exact value actually
 stored in `*PTR' is implementation defined.

No entanto, a operação de troca completa é suportado em x86-32 e x86-64, fornecendo efetivamente o lock xchg envoltório você teria necessidade de escrever.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top