C++11异步操作
C++11異步操作
C++ 11 提供了異步操作相關的類,主要有std::future std::promise std::package_task
std::future作為異步結果的傳輸通道,獲取線程函數的返回值;
std::promise用來包裝一個值,將數據和std::future綁定;
std::package用來包裝一個對象,將數據和future綁定起來,以方便異步調用;
std::future
future提供了異步查詢的通道,我們可以用同步等待的方式來獲取結果,可以通過查詢future的狀態(future_status)來獲取異步操作的結果
enum class future_status {ready, //異步操作已經完成timeout, //異步操作超時deferred //異步操作還沒開始 };我們可以不斷查詢future的狀態,并比對,直到任務完成為止
std::promise
std::promise將數據和future綁定,為獲取線程中的某個值提供便利
示例:
#include<iostream> #include <string> #include <tuple> #include <mutex> #include <thread> #include <list> #include <condition_variable> #include <future> using namespace std; std::promise<int> pr;void set_value(int i) {std::this_thread::sleep_for(std::chrono::seconds(3));pr.set_value_at_thread_exit(i); }int main() {std::thread t1(set_value, 90);t1.join();std::future<int> f = pr.get_future();cout << f.get() << endl; }std::package_task
std::package_task包裝了一個可調用對象的包裝類(function ,lambda function ,bind expression…)
將函數和future綁定起來,以便異步調用
示例:
#include<iostream> #include <string> #include <tuple> #include <mutex> #include <thread> #include <list> #include <condition_variable> #include <future> #include <functional> using namespace std;int return_value(int i ) {cout << i << endl;return i * 10; } int main() {std::packaged_task<int(int)> task(return_value);std::future<int> f = task.get_future();std::thread t(std::ref(task),4);t.join();int result = f.get();cout << result << endl; }std::future``std::promise``std::package_task之間區別
std::future提供了一個訪問異步操作結果的機制,它和線程是一個級別的,屬于低層次的對象。在std::future之上的高一層是std:packaged_task和std::promise,它們內部都有future 以便訪問異步操作結果,std::packaged_task包裝的是一個異步操作,而std:;promise包裝的是一個值,都是為了方便異步操作,因為有時需要獲取線程中的某個值,這時就用std:promise,而有時需要獲一個異步操作的返回值,這時就用std:packaged_task。那么std:promise和std:packaged_task之間又是什么關系呢?可以將一個異步操作的結果保存到std::promise中。future被promise和package_task用來作為異步操作或者異步結果的連接通道,用std::future和std:.shared_future來獲取異步調用的結果。future是不可拷貝的,只能移動,shared_future是可以拷貝的,當需要將future放到容器中則需要用shared_future,
package_task和 shared_future的基本用法如下:
有點繞啊…
std::async
std::async可以直接用來創建異步的task,異步操作結果也保存在future中,獲取結果時future.get(),
如果不關注異步任務的結果,只是簡單地等待任務完成,則調用future.wait()方法
第一個參數f是創建線程的策略
- std::launch::async:在調用async時就開始創建線程
- std::launch::deferred:延遲方式創建線程.調用async時不創建線程,調用future函數的get()或者wait()時才創建
總結
- 上一篇: 写给新入行程序员的10条建议
- 下一篇: 常用视频格式简述(RMVB\RM\WMV