Szukasz przenośnego, prostego i eleganckiego zamiennika dla Win32 InterlockedExchangePointer. Najlepiej przy użyciu tylko C++ 11, ale również doładowanie.Czy istnieje zamiennik C++ 11 (lub boost) zamiennik dla InterlockedExchangePointer?
Odpowiedz
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);
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
@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). –
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
[std :: atomowy] (http://en.cppreference.com/w/cpp/atomic/atomic) zapewnia funkcjonalność wymiany, ale to tylko działa, jeśli możesz zmienić typ swojej zmiennej na 'std :: atomic' –
melak47