1. 程式人生 > 程式設計 >C++11的future和promise、parkged_task使用

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.

它可以從非同步的物件或者函式任務中獲取結果,它通常和std::async、promise、packaged_task相互呼叫。

future物件通常是在valid有效的情況下可以使用,預設的建構函式是valid是false的,所以在使用future時,需要對其物件進行初始化。

future的成員函式

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

成員函式

future用法

future可以從多執行緒中獲取到相關的結果或者是執行緒輸出的結果。因為執行緒的輸出結果不會馬上輸出(等待執行完成),所以future會有一個共享的狀態用於判斷當前future的狀態。

future輸出結果會有三種狀態,型別是std::future_status,它們分別是

  • deferred:還沒開始;
  • ready:已經完成;
  • timeout:執行超時.

其中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);
  //方法一,用於等待非同步操作的資料
  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(); //方法二,等待非同步執行緒的資料
  }
  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為獲取執行緒函式中的某個值提供便利,線上程函式中給外面傳進來的promise賦值,當執行緒函式執行完成之後就可以通過promis獲取該值了,值得注意的是取值是間接的通過promise內部提供的future來獲取的。

promise 成員函式

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

成員函式

它的基本用法:

 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儲存了一個共享狀態的值,而packaged_task儲存的是一 個函式。它的基本用法:

 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獲取的是執行過程中設定的值,而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內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!