日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11异步操作

發布時間:2023/12/10 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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綁定,為獲取線程中的某個值提供便利

  • 在線程函數中為promise賦值
  • 在線程函數執行完畢后就可以通過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的基本用法如下:

    #include<iostream> #include <string> #include <tuple> #include <mutex> #include <thread> #include <list>#include <condition_variable> #include <future> #include <functional> using namespace std;int func(int x) {return x + 1; }int main() {std::packaged_task<int(int)> task(func);std::future<int> fut = task.get_future();std::thread(std::move(task), 2).detach();int value = fut.get();cout << value << endl;vector<std::shared_future<int >> v;std::shared_future<int> f = std::async(std::launch::async, [](int a, int b) {return a + b; }, 2, 3);v.push_back(f);std::cout << v[0].get() << endl;}

    有點繞啊…

    std::async

    std::async可以直接用來創建異步的task,異步操作結果也保存在future中,獲取結果時future.get(),

    如果不關注異步任務的結果,只是簡單地等待任務完成,則調用future.wait()方法

    第一個參數f是創建線程的策略

    • std::launch::async:在調用async時就開始創建線程
    • std::launch::deferred:延遲方式創建線程.調用async時不創建線程,調用future函數的get()或者wait()時才創建

    總結

    以上是生活随笔為你收集整理的C++11异步操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。