Czy jest to poprawna implementacja ogólnej funkcji zamiany atomów? Szukam rozwiązania zgodnego z C++ 03 na GCC.Funkcja zamiany atomów przy użyciu wbudowanych atomowych gcc
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
T * ptr = &a;
b =__sync_lock_test_and_set(ptr, b);
__sync_lock_release(&ptr);
}
Jeśli nie, co należy zrobić, aby to naprawić?
Również: czy __sync_lock_release
jest zawsze potrzebny? Podczas przeszukiwania innych baz kodów okazało się, że często nie jest to wywoływane. Bez uwolnienia nazwać mój kod wygląda następująco:
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
b = __sync_lock_test_and_set(&a, b);
}
PS: Atomic swap in GNU C++ jest podobne pytanie, ale to nie jest odpowiedź na moje pytanie, ponieważ podana odpowiedź wymaga C++ 11 na std::atomic
i ma podpis Data *swap_data(Data *new_data)
który nie robi” w przypadku funkcji swap
wydaje się mieć sens. (Faktycznie zamienia podany argument na globalną zmienną, która została zdefiniowana przed funkcją.)
Wygląda na to, że tylko dostęp do 'a' ma być atomowy? –
Po co wynajdować koło? Zobacz http://concurrencykit.org/ –
@BenVoigt Ten post nie daje jednoznacznej odpowiedzi. I zamienia argument z globalną zmienną. – StackedCrooked