<atomic>
定義類別和類別範本,以用來建立支援不可部分完成作業的類型。
語法
#include <atomic>
備註
注意
在使用 /clr:pure
編譯的程序代碼中,會封鎖此標頭。 和 /clr:pure
/clr:safe
在Visual Studio 2017和更新版本中都已被取代。
不可部分完成的作業有兩個主要屬性,可協助您使用多個線程來正確操作物件,而不需使用 mutex
鎖定。
由於不可部分完成的作業是不可分割的,因此不同線程中相同物件上的第二個不可部分完成作業只能在第一次不可部分完成作業之前或之後取得物件的狀態。
根據其
memory_order
自變數,不可部分完成的作業會針對相同線程中其他不可部分完成作業之效果的可見度,建立排序需求。 因此,它會禁止違反排序需求的編譯器最佳化。
在部分平台上,如果不使用 mutex
鎖定,則可能無法有效率地實作某些類型的不可部分完成作業。 不可部分完成的類型是 lock-free
,如果該類型的不可部分完成作業使用鎖定。
C++11
:在訊號處理程式中,如果 或 atomic_is_lock_free(x)
為 true
,您可以在 物件obj
obj.is_lock_free()
上執行不可部分完成的作業。
類別 atomic_flag
提供可保存 bool
旗標的最小不可部分完成類型。 它的作業永遠是無鎖定。
類別範本 atomic<T>
會儲存其自變數類型的 T
物件,並提供該預存值的不可部分完成存取權。 您可以使用任何可使用 memcpy
和 測試是否相等 memcmp
的型別來具現化它。 特別的是,您可以將它與符合這些需求的使用者定義類型搭配使用,而且在許多情況下,也可以與浮點類型搭配使用。
範本也會有一組整數類型的特製化以及指標的部分特製化。 這些特製化提供無法透過主要範本使用的其他作業。
指標特製化
atomic<T *>
部分特製化會套用至所有指標類型。 它們提供方法來執行指標算術。
整數特製化
atomic<integral>
特製化會套用至所有整數類型。 它們提供無法透過主要範本使用的其他作業。
每個 atomic<integral>
類型都會有對應巨集,可在 if directive
中用來判斷該類型上的作業在編譯時期是否無鎖定。 如果巨集的值是零,則類型上的作業不會鎖定。 如果值為 1,作業可能是無鎖定,而且需要執行階段檢查。 如果值為 2,作業是無鎖定。 您可以使用函式 atomic_is_lock_free
,在執行階段決定類型上的作業是否無鎖定。
對於每個整數類型,有一個對應的具名不可部分完成類型,可管理該整數類型的物件。 每個 atomic_integral
類型都會有一組與對應 atomic<T>
具現化相同的成員函式,而且可以傳遞給任何非成員不可部分完成函式。
atomic_integral 型別 |
整數類型 | atomic_is_lock_free 巨集 |
---|---|---|
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
名稱會針對標頭 <inttypes.h>
中定義的某些類型,針對不可部分完成範本的特製化而存在。
不可部分完成類型 | Typedef 名字 |
---|---|
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> |
結構
名稱 | 描述 |
---|---|
atomic 結構 |
描述對預存值執行 atomic 作業的物件。 |
atomic_flag 結構 |
描述以不可部分完成方式設定和清除 bool 旗標的物件。 |
列舉
名稱 | 描述 |
---|---|
memory_order 列舉 |
為記憶體位置上的同步處理作業提供符號名稱。 這些作業會影響一個執行緒的指派如何在其他執行緒中變成可見。 |
函式
在下列清單中,結尾不是 _explicit
的函式具有對應 _explicit
之語意,不同之處在於其具有的memory_order_seq_cst
隱含memory_order
自變數。
名稱 | 描述 |
---|---|
atomic_compare_exchange_strong |
atomic compare and exchange 執行作業。 |
atomic_compare_exchange_strong_explicit |
atomic compare and exchange 執行作業。 |
atomic_compare_exchange_weak |
執行 weak atomic compare and exchange 作業。 |
atomic_compare_exchange_weak_explicit |
執行 weak atomic compare and exchange 作業。 |
atomic_exchange |
取代預存值。 |
atomic_exchange_explicit |
取代預存值。 |
atomic_fetch_add |
將指定的值加入現有預存值。 |
atomic_fetch_add_explicit |
將指定的值加入現有預存值。 |
atomic_fetch_and |
在指定的值和現有的預存值上執行位 「and」 (& )。 |
atomic_fetch_and_explicit |
在指定的值和現有的預存值上執行位 「and」 (& )。 |
atomic_fetch_or |
在指定的值和現有的預存值上執行位 「or」 (| )。 |
atomic_fetch_or_explicit |
在指定的值和現有的預存值上執行位 「or」 (| )。 |
atomic_fetch_sub |
將現有預存值減去指定的值。 |
atomic_fetch_sub_explicit |
將現有預存值減去指定的值。 |
atomic_fetch_xor |
在指定的值和現有的預存值上執行位“獨佔或” (^ )。 |
atomic_fetch_xor_explicit |
在指定的值和現有的預存值上執行位“獨佔或” (^ )。 |
atomic_flag_clear |
將 atomic_flag 物件中的旗標設定為 false 。 |
atomic_flag_clear_explicit |
將 atomic_flag 物件中的旗標設定為 false 。 |
atomic_flag_test_and_set |
將 atomic_flag 物件中的旗標設定為 true 。 |
atomic_flag_test_and_set_explicit |
將 atomic_flag 物件中的旗標設定為 true 。 |
atomic_init |
設定 atomic 物件中的預存值。 |
atomic_is_lock_free |
指定所指定物件上的不可部分完成作業是否為「無鎖定」。 |
atomic_load |
以不可部分完成的方式擷取值。 |
atomic_load_explicit |
以不可部分完成的方式擷取值。 |
atomic_signal_fence |
用來 fence 建立呼叫線程中具有相同線程中執行訊號處理程式之柵欄之間的記憶體排序需求。 |
atomic_store |
以不可部分完成的方式儲存值。 |
atomic_store_explicit |
以不可部分完成的方式儲存值。 |
atomic_thread_fence |
做為 , fence 可建立與其他柵欄相關的記憶體排序需求。 |
kill_dependency |
中斷可能的相依性鏈結。 |