C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- std::atomic
- std::atomic<T>::atomic
- std::atomic<T>::operator=
- std::atomic<T>::is_lock_free
- std::atomic<T>::is_always_lock_free
- std::atomic<T>::store
- std::atomic<T>::load
- std::atomic<T>::operator T()
- std::atomic<T>::exchange
- std::atomic<T>::compare_exchange_weak, std::atomic<T>::compare_exchange_strong
- std::atomic<T>::wait
- std::atomic<T>::notify_one
- std::atomic<T>::notify_all
- std::atomic<T>::fetch_add
- std::atomic<T>::fetch_sub
- std::atomic<T>::fetch_and
- std::atomic<T>::fetch_or
- std::atomic<T>::fetch_xor
- std::atomic<T>::operator++,++(int),--,--(int)
- std::atomic<T>::operator+=,-=,&=,|=,^=
- std::atomic_store, std::atomic_store_explicit
- std::atomic_load, std::atomic_load_explicit
- std::atomic_exchange, std::atomic_exchange_explicit
- std::atomic_flag
- std::atomic_ref
- std::atomic_compare_exchange_weak, std::atomic_compare_exchange_strong, std::atomic_compare_exchange_weak_explicit, std::atomic_compare_exchange_strong_explicit
- std::atomic_fetch_add, std::atomic_fetch_add_explicit
- std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
- std::atomic_fetch_and, std::atomic_fetch_and_explicit
- std::atomic_fetch_or, std::atomic_fetch_or_explicit
- std::atomic_fetch_xor, std::atomic_fetch_xor_explicit
- std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
- std::atomic_wait, std::atomic_wait_explicit
- std::atomic_notify_one
- std::atomic_notify_all
- std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
- std::atomic_flag_clear, std::atomic_flag_clear_explicit
- std::atomic_flag_test, std::atomic_flag_test_explicit
- std::atomic_flag_wait, std::atomic_flag_wait_explicit
- std::atomic_flag_notify_one
- std::atomic_flag_notify_all
- std::atomic_init
- ATOMIC_VAR_INIT
- ATOMIC_FLAG_INIT
- std::memory_order
- std::kill_dependency
- std::atomic_thread_fence
- std::atomic_signal_fence
- 注é
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >ååæä½åº > std::atomic
std::atomic
æ¯ä¸ª std::atomic 模æ¿çå®ä¾ååå
¨ç¹åå®ä¹ä¸ä¸ªååç±»åãè¥ä¸ä¸ªçº¿ç¨åå
¥åå对象ï¼åæ¶å¦ä¸çº¿ç¨ä»å®è¯»åï¼åè¡ä¸ºè¯å¥½å®ä¹ï¼æ°æ®ç«äºçç»èè§å
忍¡åï¼ã
å¦å¤ï¼å¯¹åå对象ç访é®å¯ä»¥å»ºç«çº¿ç¨é´åæ¥ï¼å¹¶æ std::memory_order æå¯¹éååå å访é®å®åºã
std::atomic æ¢ä¸å¯å¤å¶äº¦ä¸å¯ç§»å¨ã
ç¹å
åçæ¨¡æ¿
åç std::atomic 模æ¿å¯ç¨ä»»ä½æ»¡è¶³å¯å¤å¶æé (CopyConstructible) åå¯å¤å¶èµå¼ (CopyAssignable) çå¯å¹³å¡å¤å¶ (TriviallyCopyable) ç±»å T ç¹åãè¥ä¸åä»»ä½å¼ä¸º false åç¨åºä¸ºè°¬æï¼
- std::is_trivially_copyable<T>::value
- std::is_copy_constructible<T>::value
- std::is_move_constructible<T>::value
- std::is_copy_assignable<T>::value
- std::is_move_assignable<T>::value
std::atomic<bool> 使ç¨åçæ¨¡æ¿ãå®ä¿è¯æ¯æ åå¸å±ç»æä½ã
é¨åç¹å
æ ååºä¸ºä¸åç±»åæä¾ std::atomic 模æ¿çç¹åï¼å®ä»¬æ¥æåçæ¨¡æ¿æä¸æ¥æçé¢å¤å±æ§ï¼
2) å¯¹æææéç±»åçé¨åç¹å std::atomic<U*> ãè¿äºç¹åæ¥ææ åå¸å±ãå¹³å¡é»è®¤æé 彿° (C++20 å)å平塿æå½æ°ãé¤äºä¸ºææååç±»åæä¾çæä½ï¼è¿äºç¹åé¢å¤æ¯æéåæéç±»åçååç®æ¯è¿ç®ï¼ä¾å¦ fetch_add ã fetch_sub ã
|
3-4) 为 std::shared_ptr å std::weak_ptr æä¾é¨åç¹å std::atomic<std::shared_ptr<U>> å std::atomic<std::weak_ptr<U>> ã ç»èè§ std::atomic<std::shared_ptr> å std::atomic<std::weak_ptr> ã |
(C++20 èµ·) |
å¯¹æ´æ°ç±»åçç¹å
以ä¸åæ´æ°ç±»åä¹ä¸å®ä¾åæ¶ï¼ std::atomic æä¾éåäºæ´æ°ç±»åçé¢å¤ååæä½ï¼ä¾å¦ fetch_add ã fetch_sub ã fetch_and ã fetch_or ã fetch_xor ï¼
- å符类å char ã char8_t (C++20 èµ·)ã char16_t ã char32_t å wchar_t ï¼
- æ åæç¬¦å·æ´æ°ç±»åï¼ signed char ã short ã int ã long å long long ï¼
- æ åæ ç¬¦å·æ´æ°ç±»åï¼ unsigned char ã unsigned short ã unsigned int ã unsigned long å unsigned long long ï¼
- ä»»ä½å¤´æä»¶ <cstdint> ä¸ç typedef æéçé¢å¤æ´æ°ç±»åã
å¦å¤ï¼ç»æç std::atomic<Integral> ç¹åæ¥ææ åå¸å±ãå¹³å¡é»è®¤æé 彿° (C++20 å)å平塿æå½æ°ãå®ä¹æç¬¦å·æ´æ°ç®æ¯ä¸ºä½¿ç¨è¡¥ç ï¼æ æªå®ä¹ç»æã
对浮ç¹ç±»åçç¹å以浮ç¹ç±»å float ã double å long double ä¹ä¸å®ä¾åæ¶ï¼ å¦å¤ï¼ç»æç æ æä½å¯¼è´æªå®ä¹è¡ä¸ºï¼å³ä½¿ç»æä¸è½ä»¥æµ®ç¹ç±»åè¡¨ç¤ºãææçæµ®ç¹ç¯å¢å¯è½ä¸åäºè°ç¨æ¹çº¿ç¨çæµ®ç¹ç¯å¢ã |
(C++20 èµ·) |
ç±»åå«å
为 bool åææä¸é¢ååºçæ´æ°ç±»åæä¾å¦ä¸ç±»åå«åï¼
| Â | |
| ç±»åå«å | å®ä¹ |
| std::atomic_bool | std::atomic<bool> |
| std::atomic_char | std::atomic<char> |
| std::atomic_schar | std::atomic<signed char> |
| std::atomic_uchar | std::atomic<unsigned char> |
| std::atomic_short | std::atomic<short> |
| std::atomic_ushort | std::atomic<unsigned short> |
| std::atomic_int | std::atomic<int> |
| std::atomic_uint | std::atomic<unsigned int> |
| std::atomic_long | std::atomic<long> |
| std::atomic_ulong | std::atomic<unsigned long> |
| std::atomic_llong | std::atomic<long long> |
| std::atomic_ullong | std::atomic<unsigned long long> |
| std::atomic_char8_t (C++20) | std::atomic<char8_t> |
| std::atomic_char16_t | std::atomic<char16_t> |
| std::atomic_char32_t | std::atomic<char32_t> |
| std::atomic_wchar_t | std::atomic<wchar_t> |
| std::atomic_int8_t | std::atomic<std::int8_t> |
| std::atomic_uint8_t | std::atomic<std::uint8_t> |
| std::atomic_int16_t | std::atomic<std::int16_t> |
| std::atomic_uint16_t | std::atomic<std::uint16_t> |
| std::atomic_int32_t | std::atomic<std::int32_t> |
| std::atomic_uint32_t | std::atomic<std::uint32_t> |
| std::atomic_int64_t | std::atomic<std::int64_t> |
| std::atomic_uint64_t | std::atomic<std::uint64_t> |
| std::atomic_int_least8_t | std::atomic<std::int_least8_t> |
| std::atomic_uint_least8_t | std::atomic<std::uint_least8_t> |
| std::atomic_int_least16_t | std::atomic<std::int_least16_t> |
| std::atomic_uint_least16_t | std::atomic<std::uint_least16_t> |
| std::atomic_int_least32_t | std::atomic<std::int_least32_t> |
| std::atomic_uint_least32_t | std::atomic<std::uint_least32_t> |
| std::atomic_int_least64_t | std::atomic<std::int_least64_t> |
| std::atomic_uint_least64_t | std::atomic<std::uint_least64_t> |
| std::atomic_int_fast8_t | std::atomic<std::int_fast8_t> |
| std::atomic_uint_fast8_t | std::atomic<std::uint_fast8_t> |
| std::atomic_int_fast16_t | std::atomic<std::int_fast16_t> |
| std::atomic_uint_fast16_t | std::atomic<std::uint_fast16_t> |
| std::atomic_int_fast32_t | std::atomic<std::int_fast32_t> |
| std::atomic_uint_fast32_t | std::atomic<std::uint_fast32_t> |
| std::atomic_int_fast64_t | std::atomic<std::int_fast64_t> |
| std::atomic_uint_fast64_t | std::atomic<std::uint_fast64_t> |
| std::atomic_intptr_t | std::atomic<std::intptr_t> |
| std::atomic_uintptr_t | std::atomic<std::uintptr_t> |
| std::atomic_size_t | std::atomic<std::size_t> |
| std::atomic_ptrdiff_t | std::atomic<std::ptrdiff_t> |
| std::atomic_intmax_t | std::atomic<std::intmax_t> |
| std::atomic_uintmax_t | std::atomic<std::uintmax_t> |
注æï¼ std::atomic_intN_t ã std::atomic_uintN_t ã std::atomic_intptr_t å atomic_uintptr_t åå«è¥ä¸å¯è¥å®ä¹äº std::intN_t ã std::uintN_t ã std::intptr_t å std::uintptr_t ææå®ä¹ã
|
æä¾é¢å¤çç¹æ®ç¨éç±»åå«åï¼
|
(C++20 èµ·) |
æåç±»å
| Â | |
| æåç±»å | å®ä¹ |
value_type
|
T (æ 论æ¯å¦ç¹å)
|
difference_type
|
value_type (ä»
对 atomic<Integral> å atomic<Floating> (C++20 èµ·) ç¹å)std::ptrdiff_t (ä» å¯¹ atomic<U*> ç¹å)
|
difference_type ä¸å¨åç atomic 模æ¿ä¸ï¼æä¸å¨å¯¹ std::shared_ptr å std::weak_ptr çé¨åç¹åä¸å®ä¹ã
æå彿°
| æé åå对象 (å ¬å¼æå彿°) | |
| åå¨å¼äºåå对象 (å ¬å¼æå彿°) | |
| æ£æ¥åå对象æ¯å¦å
é (å ¬å¼æå彿°) | |
| ååå°ä»¥éååå¯¹è±¡æ¿æ¢åå对象çå¼ (å ¬å¼æå彿°) | |
| ååå°è·å¾åå对象çå¼ (å ¬å¼æå彿°) | |
| ä»åå对象å è½½å¼ (å ¬å¼æå彿°) | |
| ååå°æ¿æ¢åå对象çå¼å¹¶è·å¾å®å
åææçå¼ (å ¬å¼æå彿°) | |
| ååå°æ¯è¾åå对象ä¸éåååæ°çå¼ï¼è¥ç¸çåè¿è¡äº¤æ¢ï¼è¥ä¸ç¸çåè¿è¡å è½½ (å ¬å¼æå彿°) | |
| (C++20) |
é»å¡çº¿ç¨ç´è³è¢«æéä¸åå弿´æ¹ (å ¬å¼æå彿°) |
| (C++20) |
æéè³å°ä¸ä¸ªå¨åå对象ä¸ççå¾
ä¸é»å¡ççº¿ç¨ (å ¬å¼æå彿°) |
| (C++20) |
æéææå¨åå对象ä¸ççå¾
ä¸é»å¡ççº¿ç¨ (å ¬å¼æå彿°) |
常é | |
| [éæ] (C++17) |
æç¤ºè¯¥ç±»åæ¯å¦å§ç»å
é (å ¬å¼éææå常é) |
ç¹åæå彿°
| ååå°å°åæ°å å°åå¨äºåå对象çå¼ï¼å¹¶è¿åå
åä¿æçå¼ (å ¬å¼æå彿°) | |
| ååå°ä»åå¨äºåå对象çå¼åå»åæ°ï¼å¹¶è·å¾å
åä¿æçå¼ (å ¬å¼æå彿°) | |
| ååå°è¿è¡åæ°ååå对象çå¼çéä½ä¸ï¼å¹¶è·å¾å
åä¿æçå¼ (å ¬å¼æå彿°) | |
| ååå°è¿è¡åæ°ååå对象çå¼çé使ï¼å¹¶è·å¾å
åä¿æçå¼ (å ¬å¼æå彿°) | |
| ååå°è¿è¡åæ°ååå对象çå¼çéä½å¼æï¼å¹¶è·å¾å
åä¿æçå¼ (å ¬å¼æå彿°) | |
| 令ååå¼å¢å æåå°ä¸ (å ¬å¼æå彿°) | |
| å ãåï¼æä¸ååå¼è¿è¡éä½ä¸ãæã弿 (å ¬å¼æå彿°) |
注解
åå¨çä»·äº std::atomic æææå彿°çéæå彿°æ¨¡æ¿ãè¿äºéæå彿°å¯ä»¥é¢å¤å¯¹é std::atomic ç¹åçç±»åéè½½ï¼ä½ä¸è½ä¿è¯ååæ§ãæ ååºä¸ä»
æçè¿ç§ç±»åæ¯ std::shared_ptr<U> ã
gcc å clang ä¸ï¼æ¤å¤æè¿°çæäºåè½è¦æ±éè¿ -latomic 龿¥ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2441 | C++11 | æ·»å äº(å¯é)å®å®½æ´æ°ç±»åçç¹å | |
| P0558R1 | C++11 | å®è´¨ä¸éåäºè§å®ä»¥è§£å³æ°ä¸ªé®é¢ | |
| LWG 3012 | C++11 | std::atomic<T> 对任ä½å¯å¹³å¡å¤å¶ä½éå¯å¤å¶ç T 容许
|
ç¦æ¢è¿ç§ç¹å |
åé
| (C++11) |
å
éçå¸å°ååç±»å (ç±») |
å¼ç¨
- C++11 standard (ISO/IEC 14882:2011):
- 29.5 Atomic types [atomics.types.generic]