std::future可以從異步任務中獲取結果,一般與std::async配合使用,std::async用於創建異步任務,實際上就是創建一個線程執行相應任務。
先看段代碼:
#include <future> #include <iostream> #include <stout/stringify.hpp> bool is_prime(int x) { for (int i=0; i<x; i++) { if (x % i == 0) return false; } return true; } int main() { std::future<bool> fut = std::async(is_prime, 700020007); std::cout << "please wait"; std::chrono::milliseconds span(100); while (fut.wait_for(span) != std::future_status::ready) std::cout << "."; std::cout << std::endl; bool ret = fut.get(); std::cout << "final result: " << stringify(ret) << std::endl; return 0; }
std::async會首先創建線程執行is_prime(700020007), 任務創建之后,std::async立即返回一個std::future對象。
主線程既可使用std::future::get獲取結果,如果調用過程中,任務尚未完成,則主線程阻塞至任務完成。
主線程也可使用std::future::wait_for等待結果返回,wait_for可設置超時時間,如果在超時時間之內任務完成,則返回std::future_status::ready狀態;如果在超時時間之內任務尚未完成,則返回std::future_status::timeout狀態。