C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- std::thread
- std::stop_token
- std::stop_source
- std::stop_callback
- std::this_thread::get_id
- std::shared_timed_mutex
- std::shared_lock
- std::lock_guard
- std::hardware_destructive_interference_size, std::hardware_constructive_interference_size
- std::counting_semaphore, std::binary_semaphore
- std::jthread
- cpp/thread/barrier
- std::future
- std::this_thread::yield
- std::this_thread::sleep_for
- std::this_thread::sleep_until
- std::mutex
- std::recursive_mutex
- std::shared_mutex
- std::timed_mutex
- std::recursive_timed_mutex
- std::scoped_lock
- std::unique_lock
- std::defer_lock_t, std::try_to_lock_t, std::adopt_lock_t
- std::lock
- std::try_lock
- std::defer_lock, std::try_to_lock, std::adopt_lock
- std::once_flag
- std::call_once
- std::condition_variable
- std::condition_variable_any
- std::notify_all_at_thread_exit
- std::cv_status
- std::latch
- std::promise
- std::shared_future
- std::packaged_task
- std::async
- std::launch
- std::future_status
- std::future_error
- std::future_category
- std::future_errc
- 注é
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >çº¿ç¨æ¯æåº > std::async
std::async
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
(C++17 å)
std::future<std::invoke_result_t<std::decay_t<Function>,
                       std::decay_t<Args>...>>
(C++20 å)
[[nodiscard]]
std::future<std::invoke_result_t<std::decay_t<Function>,
                 std::decay_t<Args>...>>
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
(C++17 å)
std::future<std::invoke_result_t<std::decay_t<Function>,
                 std::decay_t<Args>...>>
(C++20 å)
[[nodiscard]]
std::future<std::invoke_result_t<std::decay_t<Function>,
                 std::decay_t<Args>...>>
彿°æ¨¡æ¿ async 弿¥å°è¿è¡å½æ° f ï¼æ½å¨å°å¨å¯è½æ¯çº¿ç¨æ± ä¸é¨åçå离线ç¨ä¸ï¼ï¼å¹¶è¿åæç»å°ä¿æè¯¥å½æ°è°ç¨ç»æç std::future ã
f å¯è½æ§è¡äºå¦ä¸çº¿ç¨ï¼æè
å®å¯è½å¨æ¥è¯¢äº§çç std::future ç弿¶åæ¥è¿è¡ãpolicy ï¼ä»¥åæ° args è°ç¨å½æ° f ï¼
- è¥è®¾ç½® async æ å¿ï¼å³ (policy & std::launch::async) != 0 ï¼ï¼å
async卿°çæ§è¡çº¿ç¨ï¼åå§åææçº¿ç¨å±å对象åï¼æ§è¡å¯è°ç¨å¯¹è±¡fï¼å¦åäº§åº std::thread(std::forward<F>(f), std::forward<Args>(args)...) ï¼é¤äºè¥fè¿å弿æåºå¼å¸¸ï¼åäºå¯éè¿asyncè¿åç»è°ç¨æ¹ç std::future 访é®çå ±äº«ç¶æåå¨ç»æã - è¥è®¾ç½® deferred æ å¿ï¼å³ (policy & std::launch::deferred) != 0 ï¼ï¼å
async以å std::thread æé 彿°çæ¹å¼è½¬æ¢fä¸args...ï¼ä½ä¸äº§åºæ°çæ§è¡çº¿ç¨ãèæ¯è¿è¡æ°æ§æ±å¼ï¼å¨asyncæè¿åç std::future ä¸é¦æ¬¡è°ç¨é宿¶çå¾ å½æ°ï¼å°å¯¼è´å¨å½å线ç¨ï¼ä¸å¿ æ¯æåè°ç¨std::asyncç线ç¨ï¼ä¸ï¼ä»¥args...ï¼ä½ä¸ºå³å¼ä¼ éï¼ç坿¬è°ç¨fï¼äº¦ä½ä¸ºå³å¼ï¼ç坿¬ãå°ç»ææå¼å¸¸ç½®äºå ³èå°è¯¥ future çå ±äº«ç¶æï¼ç¶åæä»¤å®å°±ç»ªã对åä¸ std::future çææåç»è®¿é®é½ä¼ç«å³è¿åç»æã - è¥
policyä¸è®¾ç½®äº std::launch::async å std::launch::deferred 两个æ å¿ï¼åè¿è¡å¼æ¥æ§è¡è¿æ¯æ°æ§æ±å¼åå³äºå®ç°ã
- è¥è®¾ç½® async æ å¿ï¼å³ (policy & std::launch::async) != 0 ï¼ï¼å
|
(C++14 èµ·) |
任使
åµä¸ï¼å¯¹ std::async çè°ç¨åæ¥äºï¼å®ä¹äº std::memory_order ï¼å¯¹ f çè°ç¨ï¼ä¸ f ç宿å
åºäºä»¤å
±äº«ç¶æå°±ç»ªãè¥éæ© async çç¥ï¼åå
³è线ç¨ç宿忥äºé¦ä¸ªçå¾
äºå
±äº«ç¶æä¸ç彿°çæåè¿åï¼ææåä¸ä¸ªéæ¾å
±äº«ç¶æç彿°çè¿åï¼ä¸¤è
çå
å°æ¥è
ã
åæ°
| f | - | è¦è°ç¨çå¯è°ç¨ (Callable) 对象 | ||||||||
| args... | - | ä¼ éç» f çåæ°
| ||||||||
| policy | - | 使©ç å¼ï¼æ¯ä¸ªåç¬ä½æ§å¶å
è®¸çæ§è¡æ¹æ³
| ||||||||
| ç±»åè¦æ± | ||||||||||
-Function, Args å¿
须满足å¯ç§»å¨æé (MoveConstructible) çè¦æ±ã
| ||||||||||
è¿åå¼
æä»£æ¤æ¬¡è°ç¨ std::async æå建çå
±äº«ç¶æç std::future ã
å¼å¸¸
è¥è¿è¡çç¥çäº std::launch::async ä¸å®ç°æ æ³å¼å§æ°çº¿ç¨ï¼è¯¥æ
åµä¸ï¼è¥è¿è¡çç¥ä¸º async|deferred æè®¾ç½®äºé¢å¤ä½ï¼åå®å°åéå° deferred æå®ç°å®ä¹ççç¥ï¼ï¼åæåºä»¥ std::errc::resource_unavailable_try_again 为é误æ¡ä»¶ç std::system_error ï¼æè
è¥æ æ³åé
å
鍿°æ®ç»ææç¨çå
åï¼å为 std::bad_alloc ã
注解
å®ç°å¯ä»¥éè¿å¨é»è®¤è¿è¡çç¥ä¸å¯ç¨é¢å¤ï¼å®ç°å®ä¹çï¼ä½ï¼æ©å± std::async 第ä¸éè½½çè¡ä¸ºã
å®ç°å®ä¹çè¿è¡çç¥çä¾åæ¯åæ¥çç¥ï¼å¨ async è°ç¨å ç«å³æ§è¡ï¼åä»»å¡çç¥ï¼ç±»ä¼¼ async ï¼ä½ä¸æ¸ ç线ç¨å±å对象ï¼ã
è¥ä» std::async è·å¾ç std::future æªè¢«ç§»å¨æç»å®å°å¼ç¨ï¼åå¨å®æ´è¡¨è¾¾å¼ç»å°¾ï¼ std::future çææå½æ°å°é»å¡ç´è³å¼æ¥è®¡ç®å®æï¼å®è´¨ä¸ä»¤å¦ä¸ä»£ç 忥ï¼
std::async(std::launch::async, []{ f(); }); // 临æ¶éçææå½æ°çå¾ f() std::async(std::launch::async, []{ g(); }); // f() 宿åä¸å¼å§
ï¼æ³¨æï¼ä»¥è°ç¨ std::async 以å¤çæ¹å¼è·å¾ç std::future çææå½æ°å³ä¸é»å¡ï¼
示ä¾
#include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <future> #include <string> #include <mutex>  std::mutex m; struct X { void foo(int i, const std::string& str) { std::lock_guard<std::mutex> lk(m); std::cout << str << ' ' << i << '\n'; } void bar(const std::string& str) { std::lock_guard<std::mutex> lk(m); std::cout << str << '\n'; } int operator()(int i) { std::lock_guard<std::mutex> lk(m); std::cout << i << '\n'; return i + 10; } };  template <typename RandomIt> int parallel_sum(RandomIt beg, RandomIt end) { auto len = end - beg; if (len < 1000) return std::accumulate(beg, end, 0);  RandomIt mid = beg + len/2; auto handle = std::async(std::launch::async, parallel_sum<RandomIt>, mid, end); int sum = parallel_sum(beg, mid); return sum + handle.get(); }  int main() { std::vector<int> v(10000, 1); std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '\n';  X x; // 以é»è®¤çç¥è°ç¨ x.foo(42, "Hello") ï¼ // å¯è½åæ¶æå° "Hello 42" æå»¶è¿æ§è¡ auto a1 = std::async(&X::foo, &x, 42, "Hello"); // 以 deferred çç¥è°ç¨ x.bar("world!") // è°ç¨ a2.get() æ a2.wait() æ¶æå° "world!" auto a2 = std::async(std::launch::deferred, &X::bar, x, "world!"); // 以 async çç¥è°ç¨ X()(43) ï¼ // åæ¶æå° "43" auto a3 = std::async(std::launch::async, X(), 43); a2.wait(); // æå° "world!" std::cout << a3.get() << '\n'; // æå° "53" } // è¥ a1 卿¤ç¹æªå®æï¼å a1 çææå½æ°å¨æ¤æå° "Hello 42"
å¯è½çè¾åºï¼
The sum is 10000 43 world! 53 Hello 42
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2021 | C++11 | è¿åç±»å䏿£ç¡®ï¼ deferred çæ åµä¸åæ°çå¼ç±»å«ä¸æ | æ´æ£è¿åç±»åï¼æç¡®ä½¿ç¨å³å¼ |