Sdílet prostřednictvím


<atomic>

Definuje třídy a šablony tříd, které se mají použít k vytvoření typů, které podporují atomické operace.

Syntaxe

#include <atomic>

Poznámky

Poznámka

V kódu, který je zkompilován pomocí /clr:pure, je tato hlavička blokována. Obě /clr:pure verze jsou /clr:safe zastaralé v sadě Visual Studio 2017 a novějších verzích.

Atomická operace má dvě vlastnosti klíče, které vám pomůžou správně manipulovat s objektem pomocí více vláken bez použití mutex zámků.

  • Vzhledem k tomu, že atomická operace je nedělitelná, může druhá atomická operace stejného objektu z jiného vlákna získat stav objektu pouze před nebo po první atomické operaci.

  • Na základě argumentu memory_order atomická operace stanoví požadavky na řazení pro viditelnost účinků jiných atomických operací ve stejném vlákně. V důsledku toho inhibuje optimalizace kompilátoru, které porušují požadavky na řazení.

Na některých platformách nemusí být možné efektivně implementovat atomické operace pro některé typy bez použití mutex zámků. Atomický typ je lock-free , pokud žádné atomické operace na daném typu používají zámky.

C++11: V obslužných rutinách signálů můžete na objektu obj provádět atomické operace, pokud obj.is_lock_free() jsou nebo atomic_is_lock_free(x) jsou true.

Třída atomic_flag poskytuje minimální atomický typ, který obsahuje bool příznak. Jeho operace jsou vždy bez zámku.

Šablona atomic<T> třídy ukládá objekt svého typu T argumentu a poskytuje atomický přístup k této uložené hodnotě. Můžete vytvořit instanci pomocí libovolného typu, který lze zkopírovat pomocí memcpy a otestovat rovnost pomocí memcmp. Konkrétně ho můžete použít s uživatelsky definovanými typy, které splňují tyto požadavky, a v mnoha případech s typy s plovoucí desetinou čárkou.

Šablona má také sadu specializace pro integrální typy a částečnou specializaci pro ukazatele. Tyto specializace poskytují další operace, které nejsou dostupné prostřednictvím primární šablony.

Specializace ukazatele

Částečné atomic<T *> specializace platí pro všechny typy ukazatelů. Poskytují metody pro aritmetickou aritmetickou metodu.

Integrální specializace

Specializace atomic<integral> platí pro všechny integrální typy. Poskytují další operace, které nejsou dostupné prostřednictvím primární šablony.

Každý atomic<integral> typ má odpovídající makro, které můžete použít k if directive určení v době kompilace, zda jsou operace s tímto typem uzamčené. Pokud je hodnota makra nula, operace s typem nejsou uzamčené. Pokud je hodnota 1, operace můžou být bez uzamčení a vyžaduje se kontrola za běhu. Pokud je hodnota 2, operace jsou bez uzamčení. Pomocí funkce atomic_is_lock_free můžete určit za běhu, jestli jsou operace typu bez zámku.

Pro každý celočíselný typ existuje odpovídající pojmenovaný atomický typ, který spravuje objekt tohoto integrálního typu. Každý atomic_integral typ má stejnou sadu členských funkcí jako odpovídající instance atomic<T> a lze ji předat libovolné nečlenské atomické funkce.

atomic_integral Typ Celočíselný typ 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 názvy existují pro specializace atomické šablony pro některé typy, které jsou definovány v hlavičce <inttypes.h>.

Atomický typ Typedef Jméno
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

Jméno popis
atomic Struktury Popisuje objekt, který provádí atomic operace s uloženou hodnotou.
atomic_flag Struktury Popisuje objekt, který atomicky nastavuje a vymaže bool příznak.

Výčty

Jméno popis
memory_order Výčtu Poskytuje symbolické názvy operací synchronizace v umístěních paměti. Tyto operace ovlivňují, jak se přiřazení v jednom vlákně stanou viditelnými v jiném.

Funkce

V následujícím seznamu mají funkce, které nekončí _explicit sémantikou odpovídajících _explicit, s výjimkou toho, že mají implicitní memory_order argumenty memory_order_seq_cst.

Jméno popis
atomic_compare_exchange_strong atomic compare and exchange Provede operaci.
atomic_compare_exchange_strong_explicit atomic compare and exchange Provede operaci.
atomic_compare_exchange_weak weak atomic compare and exchange Provede operaci.
atomic_compare_exchange_weak_explicit weak atomic compare and exchange Provede operaci.
atomic_exchange Nahradí uloženou hodnotu.
atomic_exchange_explicit Nahradí uloženou hodnotu.
atomic_fetch_add Přidá zadanou hodnotu do existující uložené hodnoty.
atomic_fetch_add_explicit Přidá zadanou hodnotu do existující uložené hodnoty.
atomic_fetch_and Provede bitové "and" (&) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_fetch_and_explicit Provede bitové "and" (&) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_fetch_or Provede bitové "or" (|) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_fetch_or_explicit Provede bitové "or" (|) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_fetch_sub Odečte zadanou hodnotu od existující uložené hodnoty.
atomic_fetch_sub_explicit Odečte zadanou hodnotu od existující uložené hodnoty.
atomic_fetch_xor Provede bitové "výhradní nebo" (^) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_fetch_xor_explicit Provede bitové "výhradní nebo" (^) pro zadanou hodnotu a existující uloženou hodnotu.
atomic_flag_clear Nastaví příznak v objektu atomic_flag na false.
atomic_flag_clear_explicit Nastaví příznak v objektu atomic_flag na false.
atomic_flag_test_and_set Nastaví příznak v objektu atomic_flag na true.
atomic_flag_test_and_set_explicit Nastaví příznak v objektu atomic_flag na true.
atomic_init Nastaví uloženou hodnotu v objektu atomic .
atomic_is_lock_free Určuje, jestli jsou atomické operace u zadaného objektu uzamčené.
atomic_load Atomicky načte hodnotu.
atomic_load_explicit Atomicky načte hodnotu.
atomic_signal_fence Funguje jako požadavek fence na řazení paměti mezi ploty ve volajícím vlákně, které má obslužné rutiny signálu spuštěné ve stejném vlákně.
atomic_store Atomicky ukládá hodnotu.
atomic_store_explicit Atomicky ukládá hodnotu.
atomic_thread_fence Funguje jako požadavek fence na řazení paměti s ohledem na jiné ploty.
kill_dependency Přeruší možný řetěz závislostí.

Viz také

Referenční informace k souborům hlaviček
Standardní knihovna C++ – referenční dokumentace