程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11新特性之 std::future and std::async

C++11新特性之 std::future and std::async

編輯:C++入門知識

C++11新特性之 std::future and std::async


先來個小插曲,百度翻譯,你夠了:
這裡寫圖片描述
std::future

設想這樣的情況,你希望一個線程做一些事情,然後返回你一個結果。同時,你在做一些其他的工作,該工作也許會也許不會花費你一點時間。你希望在某個特定的時間獲取那個線程的結果。
在win32中,你可以這樣
用CreateThread啟動線程
在線程裡,啟動任務,當准備完畢後發送一個事件(event),並把結果放在全局變量裡。
在主函數裡(main)做其它的事情,然後在你想要結果的地方,調用WaitFZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vclNpbmdsZU9iamVjdDxiciAvPg0K1NpjKysxMaOs1eK49r/J0tTH4cvJsbtzdGQ6OmZ1dHVyZcq1z9ajrMi7uvO3tbvYyM66zsDg0M2jrNLyzqrL/MrH0ru49sSjsOWhozwvcD4NCjxwPnN0ZDo6ZnV0dXJlIL6/vrnKx8qyw7TE2KO/vPK1pbXYy7WjrHN0ZDo6ZnV0dXJlIL/J0tTTw8C0u/HIodLssr3Izs7xtcS94bn7o6zS8rTLv8nS1LDRy/y1sbPJ0rvW1rzytaW1xM/fs8y85M2ssr21xMrWts6hozwvcD4NCjxwPsjDztLDx7+8wsfSu7j2vPK1pbXEysK2+aO608PP37PMvMbL49K70KnWtaO6PC9wPg0KPHByZSBjbGFzcz0="brush:java;"> std::thread t([]() { auto res = perform_long_computation(); });

std::thread在之前的博客中已經介紹過了。我們還可以更高效嗎?

MyResult sharedRes;
std::thread t([&]() { sharedRes = perform_long_computation(); });

這個時候,我們應該知道thread什麼時候執行結束,這裡有一個很簡單的方式

auto result = std::async([]() { return perform_long_computation(); });
MyResult finalResult = result.get();

上訴代碼很簡潔明了吧,我們需要弄清其原理。
英文描述可能更加確切:
std::future holds a shared state
std::async allow us to run the code asynchronously.
因此,有了這樣的代碼:

std::future result = std::async([]() { return perform_long_computation(); });
MyResult finalResult = result.get();

上一段完整的代碼:

// future example
#include  // std::cout
#include  // std::async, std::future
#include  // std::chrono::milliseconds
// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
for (int i=2; i fut = std::async (is_prime,444444443); 

  // do something while waiting for function to set future:
  std::cout << checking, please wait;
  std::chrono::milliseconds span (100);
  while (fut.wait_for(span)==std::future_status::timeout)
    std::cout << '.' << std::flush;

  bool x = fut.get();     // retrieve return value

  std::cout << 
444444443  << (x?is:is not) <<  prime.
;

  return 0;
}

輸出:
checking, please wait……………………
444444443 is prime.

std::async
為什麼要用std::async代替線程的創建

std::async是為了讓用戶的少費點腦子的,它讓這三個對象默契的工作。大概的工作過程是這樣的:std::async先將異步操作用std::packaged_task包裝起來,然後將異步操作的結果放到std::promise中,這個過程就是創造未來的過程。外面再通過future.get/wait來獲取這個未來的結果,怎麼樣,std::async真的是來幫忙的吧,你不用再想到底該怎麼用std::future、std::promise和std::packaged_task了,std::async已經幫你搞定一切了!

現在來看看std::async的原型

async(std::launch::async | std::launch::deferred, f, args...)

第一個參數是線程的創建策略,有兩種策略,默認的策略是立即創建線程:
std::launch::async:在調用async就開始創建線程。
std::launch::deferred:延遲加載方式創建線程。調用async時不創建線程,直到調用了future的get或者wait時才創建線程。
第二個參數是線程函數,第三個參數是線程函數的參數。

std::future future = std::async(std::launch::async, [](){ 
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return 8;  
}); 
std::cout << waiting...
;
std::future_status status;
do {
    status = future.wait_for(std::chrono::seconds(1));
    if (status == std::future_status::deferred) {
        std::cout << deferred
;
    } else if (status == std::future_status::timeout) {
        std::cout << timeout
;
    } else if (status == std::future_status::ready) {
        std::cout << ready!
;
    }
} while (status != std::future_status::ready); 

std::cout << result is  << future.get() << '
';

可能的結果:
waiting…
timeout
timeout
ready!
result is 8

這裡寫代碼片
“`

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved