<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
Název | Popis |
---|---|
atomic Struktura |
Popisuje objekt, který provádí atomic operace s uloženou hodnotou. |
atomic_flag Struktura |
Popisuje objekt, který atomicky nastavuje a vymaže bool příznak. |
Výčty
Název | Popis |
---|---|
memory_order Výčet |
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
.
Název | 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