C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- std::atomic_store, std::atomic_store_explicit
- std::atomic_load, std::atomic_load_explicit
- std::atomic_exchange, std::atomic_exchange_explicit
- std::atomic
- 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::kill_dependency
std::kill_dependency
| å®ä¹äºå¤´æä»¶ <atomic>
|
||
| template< class T > T kill_dependency( T y ) noexcept; |
(C++11 èµ·) | |
åè¯ç¼è¯å¨ std::memory_order_consume ååå è½½æä½æå¼å§çä¾èµæ ä¸ä¼æ©å¼ è¿ std::kill_dependency çè¿åå¼ï¼å³åæ°ä¸ä¼å°ä¾èµæºå¸¦è¿è¿åå¼ã
è¿å¯ç¨äºå¨ä¾èµé¾ç¦»å¼å½æ°ä½ç¨åï¼è彿°æ [[carries_dependency]] 屿§ï¼æ¶ï¼é¿å
ä¸å¿
è¦ç std::memory_order_acquire æ
æ ã
åæ°
| y | - | è¦ä»ä¾èµæ ç§»é¤å ¶è¿åå¼çè¡¨è¾¾å¼ |
è¿åå¼
è¿å y ï¼å®ä¸åæ¯ä¾èµæ çä¸é¨åã
示ä¾
//file1.cpp struct foo { int* a; int* b; }; std::atomic<struct foo*> foo_head[10]; int foo_array[10][10];  // æ¶è´¹æä½å¼å§ä¾èµé¾ï¼å®å°è±ç¦»æ¤å½æ° [[carries_dependency]] struct foo* f(int i) { return foo_head[i].load(memory_order_consume); }  // ä¾èµé¾éè¿æåæ°è¿å ¥æ¤å½æ°ï¼èå¨å½æ°å被ææï¼æ ä¸åçé¢å¤çè·å¾æä½ï¼ int g(int* x, int* y [[carries_dependency]]) { return std::kill_dependency(foo_array[*x][*y]); }
//file2.cpp [[carries_dependency]] struct foo* f(int i); int g(int* x, int* y [[carries_dependency]]);  int c = 3; void h(int i) { struct foo* p; p = f(i); // f å å¼å§çä¾èµé¾æç»è¿å ¥ p ï¼èæ è¿åº¦çè·å¾ do_something_with(g(&c, p->a)); // p->b ä¸ä»ç¼åè¿å£ do_something_with(g(p->a, &c)); // 左忰æ carries_dependency 屿§ï¼ // å¯è½åçå åè·å¾æ æ // p->b å¨è¿å ¥ g() åå为å¯è§ }
åé
| (C++11) |
为ç»å®çååæä½å®ä¹å
å顺åºå¶çº¦ (æä¸¾) |