2013-08-18 6 views

Odpowiedz

9

Nie, nie ma absolutnie żadnego sensu w podejmowaniu std::atomic także lotny, jak wewnątrz std::atomic, kod będzie uporać się z możliwością, że zmienna może się zmienić w każdej chwili, i że inne procesory mogą wymagać „powiedział”, że uległo zmianie ("mówienie" innym procesorom nie jest objęte przez volatile).

Jedyny czas, który naprawdę potrzebujesz: volatile, jeśli masz wskaźnik do elementu sprzętu, który kontroluje Twój kod - na przykład odczytywanie licznika w zegarze lub który bufor ramki jest teraz aktywny lub powiadamianie o sieci karta do odczytu danych do następnego pakietu do wysłania. Takie rzeczy są niestabilne, ponieważ kompilator nie może wiedzieć, że wartość tych rzeczy może się zmienić w dowolnym momencie.

+1

+1 Dobra odpowiedź. Zastanawiasz się, dlaczego istnieją "lotne" funkcje użytkownika 'std :: atomic '? Jeśli nie ma potrzeby "atomowego" atomu, dlaczego te "lotne" funkcje są zdefiniowane w pierwszej kolejności? –

4

Zwykle nie ma sensu.

Użyj opcji atomic, aby umożliwić modyfikowanie zmiennej w jednym wątku, podczas gdy inne wątki mogą uzyskiwać do niej dostęp bez jawnej synchronizacji.

Użyj volatile, aby kontrolować dostęp do nietypowych lokalizacji pamięci (takich jak rejestry sprzętowe), gdzie każdy odczyt i zapis musi się odbywać w kolejności określonej przez program. Normalna zmienna, atomowa lub inna, zwykle nie wymaga takiej kontroli.

Te dwa pojęcia nie są ze sobą powiązane. W szczególności nie należy mylić volatile ze słowem kluczowym używanym w innych językach, aby zmienne były atomowe. W C++, volatile nie ma nic wspólnego z interakcjami wątków.

+0

Twoje pierwsze zdanie jest intrygujące: kiedy _przypadku_ sensowne jest zadeklarowanie obiektu atomowego 'volatile'? Wydaje się, że jedynym rozsądnym zastosowaniem może być obiekt astronomiczny w nietypowym elemencie ... –

+0

@ DietmarKühl: Można sobie wyobrazić sytuację, w której można by chcieć uzyskać wielowątkowy dostęp do rejestrów sprzętowych lub coś podobnego, a obie koncepcje mogą mieć sens. Niezwykłe, ale nie poza sferą możliwości. –

+0

Tak właśnie myślałem, ale wątpię, czy byłby potrzebny do pracy! W końcu, każdy 'std :: atomic ' może być zaimplementowany za pomocą blokady mutex, a 'T', czyli układ pamięci' std :: atomic 'nie jest znany, chociaż jest znany, przynajmniej dla niektóre typy. –

Powiązane problemy