2015-03-24 37 views

Odpowiedz

10

Funkcja standard atomic types ma funkcję atomową exchange. Więc Microsoftese

PVOID volatile target; 
old_value = InterlockedExchangePointer(&target, new_value); 

staną

std::atomic<T*> target; 
old_value = target.exchange(new_value); 
+0

Czy atomowa generuje pełną barierę pamięci? więc operacje na wskaźniku występujące w innych wątkach są bezpieczne? I jak mam pracować z shared_ptr? std :: shared_ptr >? I co wtedy? jak wymienić podstawowe wskaźniki w shared_ptr, jeśli jest to w ogóle możliwe – kreuzerkrieg

+2

@kreuzerkrieg: Jedno pytanie na pytanie proszę. Domyślnie istnieje pełna bariera pamięci, ale można określić inne kolejność pamięci w drugim parametrze. Współdzielone wskaźniki nie zapewniają operacji wymiany atomowej, trzeba by było zrobić coś innego (albo za pomocą oddzielnego surowego wskaźnika atomowego, albo muteksu). –

+0

Spójrz, co znalazłem http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic wygląda na wymianę atomową dla współdzielonych wskaźników – kreuzerkrieg