AtomicSwap vez de AtomicCompareAndSwap?
-
19-09-2019 - |
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!
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.
Não pense que existe. Aqui é a referência, btw: http://developer.apple.com/Mac/library/documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/index.html#//apple_ref/doc/header/user_space_OSAtomic.h