C++11的future和promise、parkged_task使用
future 的介紹
A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads.
它可以從異步的對象或者函數(shù)任務中獲取結果,它通常和std::async、promise、packaged_task相互調用。
future對象通常是在valid有效的情況下可以使用,默認的構造函數(shù)是valid是false的,所以在使用future時,需要對其對象進行初始化。
future的成員函數(shù)

成員函數(shù)
future用法
future可以從多線程中獲取到相關的結果或者是線程輸出的結果。因為線程的輸出結果不會馬上輸出(等待執(zhí)行完成),所以future會有一個共享的狀態(tài)用于判斷當前future的狀態(tài)。
future輸出結果會有三種狀態(tài),類型是std::future_status,它們分別是
- deferred:還沒開始;
- ready:已經(jīng)完成;
- timeout:執(zhí)行超時.
其中future獲取結果的方式有這幾種:get、wait、wait_for。
1、get等待異步操作結束并返回結果;
2、wait只是等待異步操作完成;
3、wait_for是超時等待返回結果。
future和async使用的例子
#include <iostream>
#include <future>
#include <unistd.h>
int main(int argc, char **argv) {
std::future_status f_status;
auto func = [](int b) -> int{
std::cout << "async thread running...." << std::endl;
for (int i = 0; i< b; i++) {
;
}
return b;
};
std::future<int> fut = std::async(std::launch::async, func, 888888888);
std::cout << "main thread running ...." << std::endl;
std::chrono::milliseconds span(100);
//方法一,用于等待異步操作的數(shù)據(jù)
while(1) {
f_status = fut.wait_for(span);
if (f_status == std::future_status::ready) {
std::cout << "future_status::ready ";
break;
} else if(f_status == std::future_status::deferred) {
std::cout << "future_status::deferred ";
} else if(f_status == std::future_status::timeout) {
std::cout << "future_status::timeout ";
}
std::cout << std::endl;
std::cout << "................";
std::cout << std::endl;
//fut.wait(); //方法二,等待異步線程的數(shù)據(jù)
}
std::cout << "future result " << fut.get() << std::endl;
return 0;
編譯腳本
cmake_minimum_required(VERSION 2.6)
set(src ./async.cpp)
set(exe "async")
set(CMAKE_CXX_FLAGS -std=c++11)
add_executable(${exe} ${src})
target_link_libraries(${exe} -lpthread)
promise
std::promise為獲取線程函數(shù)中的某個值提供便利,在線程函數(shù)中給外面?zhèn)鬟M來的promise賦值,當線程函數(shù)執(zhí)行完成之后就可以通過promis獲取該值了,值得注意的是取值是間接的通過promise內部提供的future來獲取的。
promise 成員函數(shù)

成員函數(shù)
它的基本用法:
std::promise<int> pr;
std::thread t([](std::promise<int>& p){ p.set_value_at_thread_exit(9); },std::ref(pr));
std::future<int> f = pr.get_future();
auto r = f.get();
parkaged_task
std::packaged_task
std::packaged_task它包裝了一個可調用的目標(如function, lambda expression, bind expression, or another function object),以便異步調用,它和promise在某種程度上有點像,promise保存了一個共享狀態(tài)的值,而packaged_task保存的是一 個函數(shù)。它的基本用法:
std::packaged_task<int()> task([](){ return 7; });
std::thread t1(std::ref(task));
std::future<int> f1 = task.get_future();
auto r1 = f1.get();
promise和packaged_task與std::future的關系
std::future提供了一個訪問異步操作結果的機制,它和線程是一個級別的屬于低層 次的對象,在它之上高一層的是std::packaged_task和std::promise,他們內部都有future以便訪問異步操作結 果,std::packaged_task包裝的是一個異步操作,而std::promise包裝的是一個值,都是為了方便異步操作的,因為有時我需要獲 取線程中的某個值,這時就用std::promise,而有時我需要獲一個異步操作的返回值,這時就用std::packaged_task,說直白點就是promise獲取的是執(zhí)行過程中設置的值,而packaged_task獲取的是結果。
參考部分:
http://www.cplusplus.com/reference/future/future/?kw=future
https://www.cnblogs.com/KunLunSu/p/8051542.html
到此這篇關于C++11的future和promise、parkged_task使用 的文章就介紹到這了,更多相關C++11 future promise parkged_task內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux c 獲取本機公網(wǎng)IP的實現(xiàn)方法
本篇文章是對在linux中使用c語言獲取本機公網(wǎng)IP的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05

