亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11的future和promise、parkged_task使用

 更新時間:2020年04月24日 16:00:01   作者:深秋寧靜  
這篇文章主要介紹了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內(nèi)部提供的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,他們內(nèi)部都有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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • QT5交叉編譯入門級教程(arm64、mips64)

    QT5交叉編譯入門級教程(arm64、mips64)

    交叉編譯就是在當前系統(tǒng)平臺上,開發(fā)編譯運行于其它平臺的程序,比如本文硬件環(huán)境是x86平臺,但是編譯出來的程序是在arm64架構、mips64等架構上運行,本文給大家分享QT5交叉編譯入門級教程(arm64、mips64),感興趣的朋友一起看看吧
    2023-11-11
  • C++代碼實現(xiàn)逆波蘭表達式

    C++代碼實現(xiàn)逆波蘭表達式

    這篇文章主要為大家詳細介紹了C++代碼實現(xiàn)逆波蘭表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言數(shù)據(jù)結構之判斷循環(huán)鏈表空與滿

    C語言數(shù)據(jù)結構之判斷循環(huán)鏈表空與滿

    這篇文章主要介紹了C語言數(shù)據(jù)結構之判斷循環(huán)鏈表空與滿的相關資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • vscode+platformIO開發(fā)stm32f4的實現(xiàn)

    vscode+platformIO開發(fā)stm32f4的實現(xiàn)

    這篇文章主要介紹了vscode+platformIO開發(fā)stm32f4的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 用C語言實現(xiàn)鏈式棧介紹

    用C語言實現(xiàn)鏈式棧介紹

    大家好,本篇文章主要講的是用C語言實現(xiàn)鏈式棧介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++數(shù)據(jù)精度問題的解決方案(對浮點數(shù)保存指定位小數(shù))

    C++數(shù)據(jù)精度問題的解決方案(對浮點數(shù)保存指定位小數(shù))

    對浮點數(shù)保存指定位小數(shù),怎么解決這個問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧
    2017-08-08
  • C語言數(shù)據(jù)結構實例講解單鏈表的實現(xiàn)

    C語言數(shù)據(jù)結構實例講解單鏈表的實現(xiàn)

    單鏈表是后面要學的雙鏈表以及循環(huán)鏈表的基礎,要想繼續(xù)深入了解數(shù)據(jù)結構以及C++,我們就要奠定好這塊基石!接下來就和我一起學習吧
    2022-03-03
  • C++操作json文件以及jsoncpp配置詳解

    C++操作json文件以及jsoncpp配置詳解

    這篇文章主要給大家介紹了關于C++操作json文件以及jsoncpp配置的相關資料,文中通過實例代碼及圖片介紹的非常詳細,需要的朋友可以參考下
    2021-06-06
  • C++11中的智能指針shared_ptr、weak_ptr源碼解析

    C++11中的智能指針shared_ptr、weak_ptr源碼解析

    本文是基于gcc-4.9.0的源代碼進行分析,shared_ptr和weak_ptr是C++11才加入標準的,僅對C++智能指針shared_ptr、weak_ptr源碼進行解析,需要讀者有一定的C++基礎并且對智能指針有所了解
    2021-09-09
  • 使用C語言訪問51單片機中存儲器的核心代碼

    使用C語言訪問51單片機中存儲器的核心代碼

    這篇文章主要介紹了使用C語言訪問51單片機中存儲器的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論