91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-30 14:54:27 來源:億速云 閱讀:219 作者:小豬 欄目:編程語言

這篇文章主要講解了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獲取的是結果。

看完上述內容,是不是對C++11的future和promise、parkged_task的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新密市| 阜宁县| 江孜县| 台南县| 虹口区| 明水县| 安义县| 乌什县| 屏东县| 梓潼县| 黄冈市| 平顶山市| 广水市| 上高县| 武夷山市| 旅游| 甘孜| 息烽县| 林州市| 舞钢市| 博客| 铜梁县| 抚远县| 平凉市| 萝北县| 什邡市| 翼城县| 晴隆县| 巍山| 大同市| 兴宁市| 霍城县| 鹰潭市| 衡东县| 论坛| 樟树市| 运城市| 中牟县| 海安县| 科技| 拜泉县|