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

C++ Futures與Promises線程使用示例講解

 更新時(shí)間:2022年11月20日 11:39:22   作者:無(wú)水先生  
future和promise的作用是在不同線程之間傳遞數(shù)據(jù)。使用指針也可以完成數(shù)據(jù)的傳遞,但是指針?lè)浅NkU(xiǎn),因?yàn)榛コ饬坎荒茏柚怪羔樀脑L問(wèn);而且指針的方式傳遞的數(shù)據(jù)是固定的,如果更改數(shù)據(jù)類型,那么還需要更改有關(guān)的接口,比較麻煩

一、說(shuō)明

Futures 和 Promises 是將數(shù)據(jù)從一個(gè)線程傳遞到另一個(gè)線程的工具。雖然這也可以通過(guò)其他功能來(lái)完成,例如全局變量、futures 和 promises 在沒(méi)有它們的情況下也能工作。此外,您不需要自己處理同步。

未來(lái)是一個(gè)從另一個(gè)線程接收值的變量。如果您訪問(wèn)未來(lái)以獲取值,您可能需要等到其他線程提供該值。 Boost.Thread 提供 boost::future 來(lái)定義未來(lái)。該類定義了一個(gè)成員函數(shù) get() 來(lái)獲取值。 get() 是一個(gè)阻塞函數(shù),可能需要等待另一個(gè)線程。

要在未來(lái)設(shè)置一個(gè)值,您需要使用一個(gè)承諾,因?yàn)?boost::future 不提供成員函數(shù)來(lái)設(shè)置一個(gè)值。

二、示例

Boost.Thread 提供類 boost::promise,它有一個(gè)成員函數(shù) set_value()。您總是將 future 和 promise 成對(duì)使用。您可以使用 get_future() 從承諾中獲得未來(lái)。您可以在不同的線程中使用未來(lái)和承諾。如果在一個(gè)線程中的 promise 中設(shè)置了一個(gè)值,則可以在另一個(gè)線程中從 future 中獲取它。

示例 44.14。使用 boost::future 和 boost::promise

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <functional>
#include <iostream>
void accumulate(boost::promise<int> &p)
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  p.set_value(sum);
}
int main()
{
  boost::promise<int> p;
  boost::future<int> f = p.get_future();
  boost::thread t{accumulate, std::ref(p)};
  std::cout << f.get() << '\n';
}

Example44.14

示例使用未來(lái)和承諾。未來(lái) f 是從承諾 p 中接收到的。然后將對(duì) promise 的引用傳遞給執(zhí)行 accumulate() 函數(shù)的線程 t。 accumulate() 計(jì)算 0 到 5 之間所有數(shù)字的總和并將其保存在 promise 中。在 main() get() 中調(diào)用 future 將總數(shù)寫入標(biāo)準(zhǔn)輸出。

未來(lái) f 和承諾 p 是相關(guān)聯(lián)的。當(dāng)對(duì)未來(lái)調(diào)用 get() 時(shí),將返回使用 set_value() 存儲(chǔ)在承諾中的值。因?yàn)樵撌纠褂脙蓚€(gè)線程,所以可能會(huì)在 accumulate() 調(diào)用 set_value() 之前在 main() 中調(diào)用 get()。在這種情況下,get() 會(huì)阻塞,直到使用 set_value() 將一個(gè)值存儲(chǔ)在 promise 中。

示例 44.14 顯示 10。

accumulate() 必須調(diào)整為在線程中執(zhí)行。它必須采用 boost::promise 類型的參數(shù)并將結(jié)果存儲(chǔ)在其中。示例 44.15 引入了 boost::packaged_task,這是一個(gè)將值從任何函數(shù)轉(zhuǎn)發(fā)到未來(lái)的類,只要該函數(shù)通過(guò) return 返回結(jié)果即可。

示例 44.15。使用 boost::packaged_task

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <utility>
#include <iostream>
int accumulate()
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  return sum;
}
int main()
{
  boost::packaged_task<int> task{accumulate};
  boost::future<int> f = task.get_future();
  boost::thread t{std::move(task)};
  std::cout << f.get() << '\n';
}

Example44.15

示例 44.15 與前一個(gè)類似,但這次沒(méi)有使用 boost::promise。相反,此示例使用類 boost::packaged_task,它與 boost::promise 一樣提供返回未來(lái)的成員函數(shù) get_future()。

boost::packaged_task 的構(gòu)造函數(shù)期望將在線程中執(zhí)行的函數(shù)作為參數(shù),但 boost::packaged_task 本身并不啟動(dòng)線程。必須將類型為 boost::packaged_task 的對(duì)象傳遞給 boost::thread 的構(gòu)造函數(shù),以便在新線程中執(zhí)行該函數(shù)。

boost::packaged_task 的優(yōu)點(diǎn)是它在未來(lái)存儲(chǔ)函數(shù)的返回值。你不需要調(diào)整一個(gè)函數(shù)來(lái)在未來(lái)存儲(chǔ)它的值。 boost::packaged_task 可以看作是一個(gè)適配器,它可以存儲(chǔ)未來(lái)任何函數(shù)的返回值。

雖然該示例擺脫了 boost::promise,但以下示例也沒(méi)有使用 boost::packaged_task 和 boost::thread。

示例 44.16。使用 boost::async()

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <iostream>
int accumulate()
{
  int sum = 0;
  for (int i = 0; i < 5; ++i)
    sum += i;
  return sum;
}
int main()
{
  boost::future<int> f = boost::async(accumulate);
  std::cout << f.get() << '\n';
}

在示例 44.16 中,accumulate() 被傳遞給函數(shù) boost::async()。這個(gè)函數(shù)統(tǒng)一了 boost::packaged_task 和 boost::thread。它在新線程中啟動(dòng) accumulate() 并返回未來(lái)。

可以將啟動(dòng)策略傳遞給 boost::async()。這個(gè)附加參數(shù)決定了 boost::async() 是在新線程中還是在當(dāng)前線程中執(zhí)行該函數(shù)。如果您傳遞 boost::launch::async,boost::async() 將啟動(dòng)一個(gè)新線程;這是默認(rèn)行為。如果您傳遞 boost::launch::deferred,該函數(shù)將在調(diào)用 get() 時(shí)在當(dāng)前線程中執(zhí)行。

盡管 Boost 1.56.0 允許將 boost::launch::async 或 boost::launch::deferred 傳遞給 boost::async(),但尚未實(shí)現(xiàn)在當(dāng)前線程中執(zhí)行函數(shù)。如果您傳遞 boost::launch::deferred,程序?qū)⒔K止。

到此這篇關(guān)于C++ Futures與Promises線程使用示例講解的文章就介紹到這了,更多相關(guān)C++ Futures與Promises內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷實(shí)例

    C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷,涉及日期的判定及流程控制的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐

    OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐

    本文主要介紹了OpenCV 視頻中火焰檢測(cè)識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼

    C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼

    這篇文章介紹了C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼,有需要的朋友可以參考一下
    2013-10-10
  • 基于Windows API實(shí)現(xiàn)遍歷所有文件并刪除的方法

    基于Windows API實(shí)現(xiàn)遍歷所有文件并刪除的方法

    這篇文章主要介紹了基于Windows API實(shí)現(xiàn)遍歷所有文件并刪除的方法,是win32應(yīng)用程序的一個(gè)比較典型的文件操作應(yīng)用技巧,需要的朋友可以參考下
    2015-04-04
  • C++解析wav文件方法介紹

    C++解析wav文件方法介紹

    最近將項(xiàng)目改為跨平臺(tái),于是音頻模塊從微軟的XAudio2改用OpenAL庫(kù)。之前使用MSDN的代碼,所以現(xiàn)在改為了C++標(biāo)準(zhǔn)的寫法,適用性更廣
    2022-09-09
  • C++ 內(nèi)存管理原理分析

    C++ 內(nèi)存管理原理分析

    本章主要介紹C++的內(nèi)存管理,以C++的內(nèi)存分布作為引入,介紹C++不同于C語(yǔ)言的內(nèi)存管理方式(new delete對(duì)比 malloc free),最后為了加深讀者的理解,會(huì)介紹new和delete的底層實(shí)現(xiàn)原理
    2021-11-11
  • C++中char[]能修改char*卻不行

    C++中char[]能修改char*卻不行

    本文主要介紹了C++中char[]能修改char*卻不行,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例

    跳表(skiplist)是一個(gè)非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)簡(jiǎn)單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實(shí)現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C++日期類實(shí)現(xiàn)的完整操作

    C++日期類實(shí)現(xiàn)的完整操作

    C++標(biāo)準(zhǔn)庫(kù)沒(méi)有提供所謂的日期類型,C++繼承了C語(yǔ)言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了關(guān)于C++日期類實(shí)現(xiàn)的完整操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • C++實(shí)現(xiàn)對(duì)回收站里的文件進(jìn)行操作的示例代碼

    C++實(shí)現(xiàn)對(duì)回收站里的文件進(jìn)行操作的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++如何使用代碼對(duì)回收站里的文件進(jìn)行操作,譬如文件的刪除與恢復(fù)等,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

厦门市| 河东区| 大渡口区| 星子县| 扬州市| 鄂托克前旗| 武山县| 那曲县| 凤凰县| 永春县| 彰武县| 西和县| 涪陵区| 德阳市| 慈溪市| 易门县| 永城市| 石林| 自治县| 瓮安县| 阳信县| 新闻| 海丰县| 兖州市| 逊克县| 九寨沟县| 夹江县| 图们市| 丰都县| 南投县| 广饶县| 新疆| 金华市| 贵港市| 沧州市| 乐安县| 兴仁县| 伊吾县| 辉南县| 宜黄县| 广州市|