国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ 多線程編程(三) 獲取線程的返回值——future

這篇具有很好參考價(jià)值的文章主要介紹了C++ 多線程編程(三) 獲取線程的返回值——future。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C++11標(biāo)準(zhǔn)庫增加了獲取線程返回值的方法,頭文件為<future>,主要包括future、promise、packaged_taskasync四個(gè)類。

那么,了解一下各個(gè)類的構(gòu)成以及功能。

1 future

future是一個(gè)模板類,它是傳輸線程返回值(也稱為共享狀態(tài))的媒介,也可以理解為線程返回的結(jié)果就安置在future中。

future 版本:C++11????? 頭文件<future>
構(gòu)造函數(shù)

1. future() noexcept;

默認(rèn)構(gòu)函數(shù),是一個(gè)無效future,valid函數(shù)返回false.

2. future(future&& other) noexcept

移動(dòng)構(gòu)造函數(shù),使用后other.valid()為false。

3. future(const future& other) = delete

禁用拷貝構(gòu)造函數(shù)。

析構(gòu)函數(shù) ~future();
get

std::future<T>? T get();

獲取共享狀態(tài),如果共享狀態(tài)尚未就緒(比如線程未結(jié)束),則堵塞,等效于wait函數(shù)。

valid

bool valid() const noexcept;

判斷future是否有效。無效future有三種情況:一是使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的;調(diào)用過移動(dòng)構(gòu)造函數(shù);三是調(diào)用過get函數(shù)。

wait

void wait() const;

獲取共享狀態(tài),如果共享狀態(tài)尚未就緒(比如線程未結(jié)束),則堵塞;阻塞結(jié)束之后,還需要繼續(xù)調(diào)用get才能獲取共享狀態(tài),此時(shí)get不再阻塞。

wait_for 設(shè)置最大阻塞時(shí)間
wait_until 設(shè)置最大阻塞時(shí)刻

跟多線程相關(guān)的類,大多都有一個(gè)特點(diǎn),就是禁用拷貝構(gòu)造函數(shù),僅能使用移動(dòng)構(gòu)造函數(shù)。

單獨(dú)使用future依然沒有辦法獲取線程的返回值,必須與promise、packaged_task或者async搭配使用。而且,單獨(dú)創(chuàng)建出來的future對(duì)象甚至都沒有意義,必須從promise、packaged_task或者async中創(chuàng)建,才有意義。

2 promise

promise對(duì)象可以看做是future類的封裝,它可以原子的修改future的共享狀態(tài)。

promise C++ 11??????????????????頭文件: <future>
構(gòu)造函數(shù)

1. promise();

默認(rèn)構(gòu)造函數(shù),構(gòu)造一個(gè)共享狀態(tài)為空的 std::promise ;

2. promise(promise&& other) noexcept;

移動(dòng)構(gòu)造函數(shù),用原屬 other 的共享狀態(tài)構(gòu)造新的 std::promise 對(duì)象,使用移動(dòng)語義。構(gòu)造完畢后, other 無共享狀態(tài);

3. future(const future& other) = delete;

禁用拷貝構(gòu)造函數(shù)。

get_future

std::future<T> get_future();

獲取共享狀態(tài),返回一個(gè)future對(duì)象。

set_value 原子地存儲(chǔ) value 到共享狀態(tài),并令狀態(tài)就緒(future::get結(jié)束阻塞)。
set_value_at_thread_exit 原子地存儲(chǔ) value 到共享狀態(tài),而不立即令狀態(tài)就緒。在當(dāng)前線程退出時(shí),再令狀態(tài)就緒。
#include <thread>
#include <future>
#include <iostream>

void fun1(std::promise<int> pro) {
    std::this_thread::sleep_for(std::chrono::seconds(3));
    pro.set_value(100);
    return;
};

int main()
{
    std::promise<int> pro;
    std::future<int> fut = pro.get_future();
    std::thread th(&fun1, std::move(pro));
    th.detach();
    std::cout << fut.get() << std::endl;
}

需要注意的一點(diǎn)是,future的模板類型與線程函數(shù)的返回類型無關(guān)。上邊f(xié)un1函數(shù)的返回值為void,但是future類型為int。

3 packaged_task

packaged_task是一個(gè)類,它主要包含了一個(gè)future對(duì)象和一個(gè)任務(wù),這個(gè)任務(wù)可以是函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對(duì)象。

packaged_task C++11????? ????????????????頭文件: <future>
構(gòu)造函數(shù)

template<class F>

explicit packaged_task(F&& f);

f 是一個(gè)函數(shù),也就是任務(wù)入口。

get_future

std::future<T> get_future();

獲取共享狀態(tài),返回一個(gè)future對(duì)象。

()運(yùn)算符

void operator()(ArgTypes...args);

args 為參數(shù)運(yùn)行存儲(chǔ)的任務(wù);任務(wù)結(jié)束時(shí),將返回值存儲(chǔ)于共享狀態(tài),并令共享狀態(tài)就緒。該函數(shù)會(huì)新開一個(gè)線程并以detach模式運(yùn)行新線程。

#include <iostream>
#include <cmath>
#include <thread>
#include <future>
#include <functional>
 
// 避免對(duì) std::pow 重載集消歧義的獨(dú)有函數(shù)
int f(int x, int y) { return std::pow(x,y); }
 
void task_lambda()
{
    std::packaged_task<int(int,int)> task([](int a, int b) {
        return std::pow(a, b); 
    });
    std::future<int> result = task.get_future();
 
    task(2, 9);
 
    std::cout << "task_lambda:\t" << result.get() << '\n';
}
 
void task_bind()
{
    std::packaged_task<int()> task(std::bind(f, 2, 11));
    std::future<int> result = task.get_future();
 
    task();
 
    std::cout << "task_bind:\t" << result.get() << '\n';
}
 
void task_thread()
{
    std::packaged_task<int(int,int)> task(f);
    std::future<int> result = task.get_future();
 
    std::thread task_td(std::move(task), 2, 10);
    task_td.join();
 
    std::cout << "task_thread:\t" << result.get() << '\n';
}
 
int main()
{
    task_lambda();
    task_bind();
    task_thread();
}

輸出:

C++ 多線程編程(三) 獲取線程的返回值——future

?與promise不同的是,packaged_task任務(wù)的返回類型就是future的類型。

4 async

async是一個(gè)模板函數(shù),它綜合了前邊promise和packaged_task的功能,一個(gè)函數(shù)就可以實(shí)現(xiàn)線程創(chuàng)建、任務(wù)執(zhí)行、獲取返回值等功能。

async的返回值是一個(gè)future對(duì)象,async所執(zhí)行的任務(wù)完成后,會(huì)令共享狀態(tài)進(jìn)入就緒狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-434563.html

#include <thread>
#include <future>
#include <iostream>
#include <unistd.h>

int main()
{
    auto ff = std::async(std::launch::async, []{ sleep(2); return 2.3; }); 

    std::cout << ff.get() << std::endl;
}

到了這里,關(guān)于C++ 多線程編程(三) 獲取線程的返回值——future的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++并發(fā)與多線程筆記八:async、future、packaged_task、promise

    本文接上文 C++并發(fā)與多線程筆記七:condition_variable、wait、notify_one/all 的內(nèi)容,主要記錄 async、future、packaged_task、promise 概念以及用法。 2.1 基本用法 std::async 是個(gè)函數(shù)模板,用來啟動(dòng)一個(gè)異步任務(wù),啟動(dòng)一個(gè)異步任務(wù)后,它返回一個(gè) std::future 類模板對(duì)象。 上述\\\"啟動(dòng)一個(gè)異步

    2023年04月13日
    瀏覽(22)
  • 【linux c多線程】線程的創(chuàng)建,線程信息的獲取,獲取線程返回值

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實(shí)現(xiàn)多機(jī)的數(shù)據(jù)庫節(jié)點(diǎn)的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點(diǎn)的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點(diǎn)的情況下對(duì)故障容災(zāi)的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年02月04日
    瀏覽(18)
  • Python 中從線程獲取返回值

    Python 中從線程獲取返回值

    這篇文章首先討論了線程的基礎(chǔ)知識(shí),并提供了一個(gè)在Python中啟動(dòng)線程的代碼示例。然后,我們將討論一個(gè)在線程中獲取函數(shù)返回值的代碼。 線程是進(jìn)程內(nèi)的輕量級(jí)執(zhí)行單元,具有自己的程序執(zhí)行狀態(tài)。一個(gè)進(jìn)程可以運(yùn)行多個(gè)線程以實(shí)現(xiàn)并發(fā)(有時(shí)也是并行)。 進(jìn)程和線程

    2024年02月07日
    瀏覽(11)
  • 使用多線程執(zhí)行任務(wù),并獲取返回結(jié)果,附異步實(shí)現(xiàn)

    使用多線程執(zhí)行任務(wù),并獲取返回結(jié)果,附異步實(shí)現(xiàn)

    這里創(chuàng)建了一個(gè)包含三個(gè)線程的固定線程池 線程池的介紹 根據(jù)主機(jī)情況實(shí)現(xiàn)自定義線程池: 也可以通過繼承 ThreadPoolExecutor 類來實(shí)現(xiàn)一個(gè)自定義線程池工具類。ThreadPoolExecutor 是 Java 標(biāo)準(zhǔn)庫中提供的一個(gè)線程池實(shí)現(xiàn),通過繼承它,我們可以實(shí)現(xiàn)自定義的線程池。 下面是一個(gè)繼

    2024年02月16日
    瀏覽(15)
  • java多線程異步處理并獲取處理后的返回值

    示例部分代碼:

    2024年02月06日
    瀏覽(18)
  • C++并發(fā)編程:std::future、std::async、std::packaged_task與std::promise的深度探索

    C++并發(fā)編程:std::future、std::async、std::packaged_task與std::promise的深度探索

    1.1 并發(fā)編程的概念 (Concept of Concurrent Programming) 并發(fā)編程是一種計(jì)算機(jī)編程技術(shù),其核心在于使程序能夠處理多個(gè)任務(wù)同時(shí)進(jìn)行。在單核處理器上,雖然任何給定的時(shí)間只能運(yùn)行一個(gè)任務(wù),但通過任務(wù)切換,可以創(chuàng)建出并發(fā)執(zhí)行的效果。而在多核處理器上,可以真正同時(shí)處理

    2024年02月05日
    瀏覽(27)
  • C++學(xué)習(xí)筆記-第11單元 標(biāo)準(zhǔn)模板庫介紹

    C++學(xué)習(xí)筆記-第11單元 標(biāo)準(zhǔn)模板庫介紹

    注:本部分內(nèi)容主要來自中國大學(xué)MOOC北京郵電大學(xué)崔毅東的 《C++程序設(shè)計(jì)》課程。 注:94條 C++程序規(guī)范。 ??本單元重點(diǎn)是對(duì)標(biāo)準(zhǔn)模板庫中的 順序容器 、 關(guān)聯(lián)容器 的使用,以及 如何創(chuàng)建迭代器以遍歷容器 。在使用容器時(shí)要注意不同容器的實(shí)現(xiàn)方式對(duì)遍歷、搜索、刪除、

    2024年02月13日
    瀏覽(25)
  • JAVA學(xué)習(xí)-網(wǎng)絡(luò)編程.Java11標(biāo)準(zhǔn)化的HTTP Client

    ??????? Java 11引入了標(biāo)準(zhǔn)化的HTTP Client,它提供了一種現(xiàn)代化、靈活且易于使用的方式來進(jìn)行HTTP通信。下面是關(guān)于Java 11標(biāo)準(zhǔn)化的HTTP Client的概述以及與其他比較和高級(jí)應(yīng)用的說明: ??????? Java 11標(biāo)準(zhǔn)化的HTTP Client是一種替代HttpURLConnection的新的HTTP客戶端庫。它提供了更

    2024年04月09日
    瀏覽(30)
  • c++ 11標(biāo)準(zhǔn)模板(STL) std::vector (二)

    c++ 11標(biāo)準(zhǔn)模板(STL) std::vector (二)

    template ? ? class T, ? ? class Allocator = std::allocatorT class vector; (1) namespace pmr { ? ? template class T ? ? using vector = std::vectorT, std::pmr::polymorphic_allocatorT; } (2) (C++17 起) 1) std::vector 是封裝動(dòng)態(tài)數(shù)組的順序容器。 2) std::pmr::vector 是使用多態(tài)分配器的模板別名。 元素相繼存儲(chǔ),這意味著不

    2024年02月02日
    瀏覽(17)
  • C++學(xué)習(xí)筆記——C++ 新標(biāo)準(zhǔn)(C++11、C++14、C++17)引入的重要特性

    C++學(xué)習(xí)筆記——C++ 新標(biāo)準(zhǔn)(C++11、C++14、C++17)引入的重要特性

    目錄 1、簡介 2.自動(dòng)類型推導(dǎo)和初始化 示例代碼 3.智能指針 示例代碼 4.Lambda 表達(dá)式 示例代碼 5.右值引用和移動(dòng)語義 示例代碼 6.并發(fā)編程支持 示例代碼 7.其他特性 八、案例:實(shí)現(xiàn)一個(gè)簡單的并發(fā)下載器 上一篇文章: ??? C++標(biāo)準(zhǔn)模板庫(STL)是C++的一個(gè)重要組成部分,它提

    2024年01月19日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包