成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Thread、Future、Promise、Packaged_task、Async之間有什么關系?

開發 前端
一個promise的set_value()只能調用一次,如果調用多次,就會throw exception,如果外部沒catch exception,程序就會crash。

并發編程一般指多線程編程,C++11之后關于多線程編程有幾個高級API:

  • std::thread
  • std::future
  • std::shared_future
  • std::promise
  • std::packaged_task
  • std::async

可能很多人都搞不清楚它們之前有什么聯系,可以直接看這張圖:

圖片

從這張圖我們可以大體看出來:

  • packaged_task ≈ promise + function
  • async ≈ thread + packaged_task
  • 通過promise的get_future()可拿到future
  • 通過future的share()可拿到shared_future

promise和future是線程之間的同步通道,類似于條件變量的封裝,看它的使用:

#include <future>
#include <iostream>
#include <thread>

int main() {
std::promise<bool> prom;
std::future<bool> f = prom.get_future();
prom.set_value(true);
std::cout << f.get() << std::endl;
}

首先創建一個promise,通過promise可以拿到future,future有wait()和get()等方法,這種方法會阻塞當前線程,直到future的源promise調用了set_value,future的wait()只有阻塞功能,而get()方法不僅有阻塞功能,還能拿到set_value()設置的值。我舉個多線程的示例:

#include <future>
#include <iostream>
#include <thread>

int main() {
std::promise<int> prom;
auto f = prom.get_future();
std::thread t(
[](std::promise<int> p) {
std::this_thread::sleep_for(std::chrono::seconds(2));
p.set_value(100);
},
std::move(prom));
std::cout << f.get() << std::endl;
if (t.joinable()) t.join();
}

這段代碼執行后會在兩秒后輸出100。這個結果就驗證了上面啰嗦的promise的future的get()的阻塞和獲取結果的能力。

注意:一個promise的set_value()只能調用一次,如果調用多次,就會throw exception,如果外部沒catch exception,程序就會crash。

promise的阻塞功能還是蠻好用的,我在工程中就經常用到它。

介紹完promise,再來看看packaged_task:

#include <future>
#include <iostream>
#include <thread>
int main() {
std::packaged_task<int(int, int)> task([](int a, int b) { return a + b; });
auto f = task.get_future();
std::thread t(std::move(task), 1, 2);
std::cout << f.get() << std::endl;
if (t.joinable()) t.join();
}

可以拿這段代碼和上面那段promise的代碼對比看看,可以得出結論:packaged_task ≈ promise + function

promise只能set_value,不太好執行復雜的邏輯,有執行函數+阻塞的需求時,就可以考慮使用packaged_task。

可以思考一下,如果要你封裝一個packaged_task,你會怎么做?

再看async:

#include <future>
#include <iostream>
#include <thread>
int main() {
auto f = std::async(
std::launch::async, [](int a, int b) { return a + b; }, 1, 2);
std::cout << f.get() << std::endl;
}

這里可以看到,使用了async后,連thread都不需要創建了,這也就驗證了上面圖中的結論:async ≈ thread + packaged_task

這里請注意:async中的第一個參數我使用的是std::launch::async,只有當參數為std::launch::async時,函數才會異步執行。

參數還可以是std::launch::deferred,參數為這個時,函數不會異步執行,只有當對應的future調用了get時,函數才會執行,而且是在當前線程執行。

關于async有幾個坑,我之前寫過一篇文章,可以看這個:async的兩個坑。

介紹完async,再介紹下shared_future。

普通的future有個特點,它不能拷貝,只能移動,這就意味著只能有一個線程一個實例可以通過get()拿到對應的結果。

如果想要多個線程多個實例拿到結果,就可以使用shared_future,那怎么拿到shared_future,可以通過普通future的shared()方法。

#include <future>
#include <iostream>
#include <thread>
int main() {
std::promise<int> prom;
auto fu = prom.get_future();
auto shared_fu = fu.share();
auto f1 = std::async(std::launch::async, [shared_fu]() { std::cout << shared_fu.get() << std::endl; });
auto f2 = std::async(std::launch::async, [shared_fu]() { std::cout << shared_fu.get() << std::endl; });
prom.set_value(102);
f1.get();
f2.get();
}

看到這里,大家應該明白thread、future、promise、packaged_task、async之間的關系了吧。

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2020-02-27 08:52:51

NFVSDN網絡

2021-10-18 10:17:07

Go Golang語言

2015-08-03 10:20:39

大數據Hadoop

2022-11-01 15:02:11

2023-11-02 09:59:53

C++設計模式

2019-09-29 19:28:13

區塊鏈比特幣加密貨幣

2021-04-27 10:14:28

大數據物聯網IOT

2015-08-27 14:05:01

大數據創業

2024-04-02 08:02:11

Dockerk8s容器

2022-02-14 11:28:51

區塊鏈元宇宙代幣

2021-07-20 08:12:55

CPU核數線程數

2021-02-02 12:46:36

Spring異步循環

2023-04-06 11:54:55

2019-03-12 11:12:50

大數據HadoopSpark

2024-03-10 21:00:33

2022-09-13 09:09:37

容器容器云容器化

2023-07-10 10:53:22

2017-12-10 22:19:30

2020-04-30 11:05:50

機器閱讀人工智能機器學習

2021-04-27 07:52:19

C++promisefuture
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美v日韩v | 欧美视频免费在线 | 放个毛片看看 | 国产高清一二三区 | 久久精品99 | 亚洲免费视频在线观看 | 在线色网| 红桃成人在线 | 国产日韩欧美精品一区二区 | 久久曰视频 | 精品久久久久久久久久久院品网 | 亚洲精品久久久蜜桃 | 美国一级片在线观看 | 久久精品国产一区老色匹 | 日韩在线播放一区 | 欧美色综合一区二区三区 | 免费黄色录像视频 | 欧美午夜一区二区三区免费大片 | 国产精品久久国产精品久久 | 狠狠狠干 | 成人免费视频网址 | 国产免费福利在线 | 久久亚洲国产精品日日av夜夜 | 免费黄色录像片 | 国产成人精品久久 | 在线看91 | 91麻豆精品国产91久久久久久久久 | av在线视 | 波多野结衣二区 | 亚洲成人自拍网 | 国产在线一区二区三区 | 一级免费毛片 | 欧美综合国产精品久久丁香 | 久久成人国产精品 | 久久蜜桃资源一区二区老牛 | 国产女人与拘做受免费视频 | 男人的天堂一级片 | 黄色国产区 | 精品婷婷 | 国产精品成人在线 | 亚洲午夜网 |