<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:pure
ten 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)
są 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 Typ |
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 Struktura |
Opisuje obiekt, który wykonuje operacje atomic na przechowywanej wartości. |
atomic_flag Struktura |
Opisuje obiekt, który niepodziecznie ustawia i czyści flagę bool . |
Wyliczenia
Nazwa/nazwisko | opis |
---|---|
memory_order Wyliczenie |
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 _explicit
elementu , 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++