<atomic>

Definiuje klasy i szablony klas do użycia do tworzenia typów, które obsługują operacje niepodzielne.

Składnia

#include <atomic>

Uwagi

Uwaga

W kodzie skompilowanym przy użyciu polecenia /clr:pureten nagłówek jest blokowany. Obie /clr:pure wersje i /clr:safe są przestarzałe w programie Visual Studio 2017 i nowszych wersjach.

Operacja niepodzielna ma dwie kluczowe właściwości, które ułatwiają poprawne manipulowanie obiektem przy użyciu wielu wątków bez używania mutex blokad.

  • Ponieważ operacja niepodzielna jest niepodzielna, druga operacja niepodzielna na tym samym obiekcie z innego wątku może uzyskać stan obiektu tylko przed lub po pierwszej operacji atomowej.

  • Na podstawie argumentu memory_order operacja niepodzielna ustanawia wymagania dotyczące kolejności widoczności efektów innych operacji niepodzielnych w tym samym wątku. W związku z tym hamuje optymalizacje kompilatora, które naruszają wymagania dotyczące kolejności.

Na niektórych platformach może nie być możliwe wydajne implementowanie operacji niepodzielnych dla niektórych typów bez używania mutex blokad. Typ niepodzielne to lock-free , jeśli nie ma operacji niepodzielnych na tym typie, użyj blokad.

C++11: W programach obsługi sygnałów można wykonywać niepodzielne operacje na obiekcie obj , jeśli obj.is_lock_free() lub atomic_is_lock_free(x)true.

Klasa atomic_flag zapewnia minimalny typ niepodzielne, który zawiera flagę bool . Jego operacje są zawsze wolne od blokady.

Szablon atomic<T> klasy przechowuje obiekt typu argumentu T i zapewnia niepodzielny dostęp do tej przechowywanej wartości. Można utworzyć wystąpienie przy użyciu dowolnego typu, który można skopiować przy użyciu funkcji memcpy i przetestować pod kątem równości przy użyciu polecenia memcmp. W szczególności można go używać z typami zdefiniowanymi przez użytkownika, które spełniają te wymagania, a w wielu przypadkach z typami zmiennoprzecinkowych.

Szablon zawiera również zestaw specjalizacji dla typów całkowitych i częściową specjalizację wskaźników. Te specjalizacje zapewniają dodatkowe operacje, które nie są dostępne za pośrednictwem szablonu podstawowego.

Specjalizacje wskaźników

Specjalizacje atomic<T *> częściowe mają zastosowanie do wszystkich typów wskaźników. Zapewniają metody arytmetyki wskaźnika.

Specjalizacje całkowite

Specjalizacje atomic<integral> mają zastosowanie do wszystkich typów całkowitych. Zapewniają one dodatkowe operacje, które nie są dostępne za pośrednictwem szablonu podstawowego.

Każdy atomic<integral> typ ma odpowiednie makro, którego można użyć w programie if directive , aby określić w czasie kompilacji, czy operacje na tym typie są wolne od blokady. Jeśli wartość makra wynosi zero, operacje na typie nie są wolne od blokady. Jeśli wartość to 1, operacje mogą być wolne od blokady, a wymagane jest sprawdzenie środowiska uruchomieniowego. Jeśli wartość to 2, operacje są wolne od blokady. Za pomocą funkcji atomic_is_lock_free można określić w czasie wykonywania, czy operacje na typie są wolne od blokady.

Dla każdego z typów całkowitych istnieje odpowiedni nazwany typ atomowy, który zarządza obiektem tego typu całkowitego. Każdy atomic_integral typ ma ten sam zestaw funkcji składowych co odpowiadające im wystąpienie atomic<T> i może być przekazywany do dowolnej z nieczłonkowych funkcji niepodzielnych.

atomic_integral Typu Typ całkowitolicztowy atomic_is_lock_free Makro
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

Typedef nazwy istnieją dla specjalizacji szablonu niepodzielnego dla niektórych typów zdefiniowanych w nagłówku <inttypes.h>.

Typ niepodzielne Typedef Nazwa
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

Struktury

Nazwa/nazwisko opis
atomic Struktury Opisuje obiekt, który wykonuje operacje atomic na przechowywanej wartości.
atomic_flag Struktury Opisuje obiekt, który niepodziecznie ustawia i czyści flagę bool .

Wyliczenia

Nazwa/nazwisko opis
memory_order Enum Dostarcza nazwy symboliczne operacji synchronizacji w lokalizacjach pamięci. Te operacje wpływają na sposób, w jaki przypisania w jednym wątku stają się widoczne w innym.

Funkcje

Na poniższej liście funkcje, które nie kończą się _explicit na semantyce odpowiadającego _explicitelementu , z tą różnicą, że mają niejawne memory_order argumenty memory_order_seq_cst.

Nazwa/nazwisko opis
atomic_compare_exchange_strong Wykonuje operację atomic compare and exchange .
atomic_compare_exchange_strong_explicit Wykonuje operację atomic compare and exchange .
atomic_compare_exchange_weak Wykonuje operację weak atomic compare and exchange .
atomic_compare_exchange_weak_explicit Wykonuje operację weak atomic compare and exchange .
atomic_exchange Zamienia przechowywaną wartość.
atomic_exchange_explicit Zamienia przechowywaną wartość.
atomic_fetch_add Dodaje określoną wartość do istniejącej przechowywanej wartości.
atomic_fetch_add_explicit Dodaje określoną wartość do istniejącej przechowywanej wartości.
atomic_fetch_and Wykonuje bitowe wartości "i" (&) na określonej wartości i istniejącej przechowywanej wartości.
atomic_fetch_and_explicit Wykonuje bitowe wartości "i" (&) na określonej wartości i istniejącej przechowywanej wartości.
atomic_fetch_or Wykonuje bitową wartość "lub" (|) na określonej wartości i istniejącej przechowywanej wartości.
atomic_fetch_or_explicit Wykonuje bitową wartość "lub" (|) na określonej wartości i istniejącej przechowywanej wartości.
atomic_fetch_sub Odejmuje określoną wartość z istniejącej przechowywanej wartości.
atomic_fetch_sub_explicit Odejmuje określoną wartość z istniejącej przechowywanej wartości.
atomic_fetch_xor Wykonuje bitową wartość "wyłączną lub" (^) dla określonej wartości i istniejącą przechowywaną wartość.
atomic_fetch_xor_explicit Wykonuje bitową wartość "wyłączną lub" (^) dla określonej wartości i istniejącą przechowywaną wartość.
atomic_flag_clear Ustawia flagę atomic_flag w obiekcie na false.
atomic_flag_clear_explicit Ustawia flagę atomic_flag w obiekcie na false.
atomic_flag_test_and_set Ustawia flagę atomic_flag w obiekcie na true.
atomic_flag_test_and_set_explicit Ustawia flagę atomic_flag w obiekcie na true.
atomic_init Ustawia przechowywaną atomic wartość w obiekcie.
atomic_is_lock_free Określa, czy operacje niepodzielne na określonym obiekcie są wolne od blokady.
atomic_load Niepodzielne pobiera wartość.
atomic_load_explicit Niepodzielne pobiera wartość.
atomic_signal_fence Działa jako element fence , który ustanawia wymagania dotyczące porządkowania pamięci między ogrodzeniami w wątku wywołującym, który zawiera programy obsługi sygnałów wykonywane w tym samym wątku.
atomic_store Niepodzielne przechowuje wartość.
atomic_store_explicit Niepodzielne przechowuje wartość.
atomic_thread_fence Działa jako element fence określający wymagania dotyczące porządkowania pamięci w odniesieniu do innych ogrodzeń.
kill_dependency Przerywa możliwy łańcuch zależności.

Zobacz też

Odwołanie do plików nagłówka
Dokumentacja standardowej biblioteki C++