最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月24日 16:00:01   作者:深秋寧?kù)o  
這篇文章主要介紹了C++11的future和promise、parkged_task使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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.

它可以從異步的對(duì)象或者函數(shù)任務(wù)中獲取結(jié)果,它通常和std::async、promise、packaged_task相互調(diào)用。

future對(duì)象通常是在valid有效的情況下可以使用,默認(rèn)的構(gòu)造函數(shù)是valid是false的,所以在使用future時(shí),需要對(duì)其對(duì)象進(jìn)行初始化。

future的成員函數(shù)

成員函數(shù)

future用法

future可以從多線程中獲取到相關(guān)的結(jié)果或者是線程輸出的結(jié)果。因?yàn)榫€程的輸出結(jié)果不會(huì)馬上輸出(等待執(zhí)行完成),所以future會(huì)有一個(gè)共享的狀態(tài)用于判斷當(dāng)前future的狀態(tài)。

future輸出結(jié)果會(huì)有三種狀態(tài),類型是std::future_status,它們分別是

  • deferred:還沒(méi)開(kāi)始;
  • ready:已經(jīng)完成;
  • timeout:執(zhí)行超時(shí).

其中future獲取結(jié)果的方式有這幾種:get、wait、wait_for。

1、get等待異步操作結(jié)束并返回結(jié)果;

2、wait只是等待異步操作完成;

3、wait_for是超時(shí)等待返回結(jié)果。

 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ù)中的某個(gè)值提供便利,在線程函數(shù)中給外面?zhèn)鬟M(jìn)來(lái)的promise賦值,當(dāng)線程函數(shù)執(zhí)行完成之后就可以通過(guò)promis獲取該值了,值得注意的是取值是間接的通過(guò)promise內(nèi)部提供的future來(lái)獲取的。

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它包裝了一個(gè)可調(diào)用的目標(biāo)(如function, lambda expression, bind expression, or another function object),以便異步調(diào)用,它和promise在某種程度上有點(diǎn)像,promise保存了一個(gè)共享狀態(tài)的值,而packaged_task保存的是一 個(gè)函數(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的關(guān)系

std::future提供了一個(gè)訪問(wèn)異步操作結(jié)果的機(jī)制,它和線程是一個(gè)級(jí)別的屬于低層 次的對(duì)象,在它之上高一層的是std::packaged_task和std::promise,他們內(nèi)部都有future以便訪問(wèn)異步操作結(jié) 果,std::packaged_task包裝的是一個(gè)異步操作,而std::promise包裝的是一個(gè)值,都是為了方便異步操作的,因?yàn)橛袝r(shí)我需要獲 取線程中的某個(gè)值,這時(shí)就用std::promise,而有時(shí)我需要獲一個(gè)異步操作的返回值,這時(shí)就用std::packaged_task,說(shuō)直白點(diǎn)就是promise獲取的是執(zhí)行過(guò)程中設(shè)置的值,而packaged_task獲取的是結(jié)果。

參考部分:

http://www.cplusplus.com/reference/future/future/?kw=future

https://www.cnblogs.com/KunLunSu/p/8051542.html

到此這篇關(guān)于C++11的future和promise、parkged_task使用 的文章就介紹到這了,更多相關(guān)C++11 future promise parkged_task內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++編譯期循環(huán)獲取變量類型詳情

    C++編譯期循環(huán)獲取變量類型詳情

    這篇文章主要介紹了C++編譯期循環(huán)獲取變量類型詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • C++17新特性個(gè)人總結(jié)

    C++17新特性個(gè)人總結(jié)

    這篇文章主要介紹了C++17新特性個(gè)人總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C++的靜態(tài)類型檢查詳解

    C++的靜態(tài)類型檢查詳解

    這篇文章主要為大家詳細(xì)介紹了C++的靜態(tài)類型檢查,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Dijkstra算法與Prim算法的異同案例詳解

    Dijkstra算法與Prim算法的異同案例詳解

    這篇文章主要介紹了Dijkstra算法與Prim算法的異同案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++ STL入門(mén)教程(3) deque雙向隊(duì)列使用方法

    C++ STL入門(mén)教程(3) deque雙向隊(duì)列使用方法

    這篇文章主要為大家詳細(xì)介紹了C++ STL入門(mén)教程第三篇,deque雙向隊(duì)列的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能(1)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能(1)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能的第一部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++命名空間實(shí)例詳解

    C++命名空間實(shí)例詳解

    這篇文章主要介紹了C++命名空間實(shí)例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C++之a(chǎn)ssert推薦用法及注意事項(xiàng)

    C++之a(chǎn)ssert推薦用法及注意事項(xiàng)

    這篇文章主要給大家介紹了關(guān)于C++之a(chǎn)ssert推薦用法及注意事項(xiàng)的相關(guān)資料,assert 是一個(gè)預(yù)處理宏,用于在運(yùn)行時(shí)檢查表達(dá)式是否為真,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • linux c 獲取本機(jī)公網(wǎng)IP的實(shí)現(xiàn)方法

    linux c 獲取本機(jī)公網(wǎng)IP的實(shí)現(xiàn)方法

    本篇文章是對(duì)在linux中使用c語(yǔ)言獲取本機(jī)公網(wǎng)IP的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++?多繼承詳情介紹

    C++?多繼承詳情介紹

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個(gè)類同時(shí)繼承多個(gè)類。只有C++等少數(shù)語(yǔ)言支持多繼承,下面我們就來(lái)看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03

最新評(píng)論

太和县| 四川省| 兴城市| 万安县| 徐州市| 兴海县| 兴海县| 集安市| 大同县| 龙口市| 松桃| 龙州县| 城步| 富平县| 安国市| 高安市| 麻城市| 聂荣县| 沐川县| 西青区| 启东市| 宿松县| 巴东县| 双峰县| 广元市| 淮滨县| 威海市| 沧源| 黑河市| 仙居县| 塘沽区| 盈江县| 武汉市| 普陀区| 谢通门县| 万荣县| 塔城市| 通山县| 青河县| 龙海市| 蓝田县|