欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年11月20日 11:39:22   作者:無水先生  
future和promise的作用是在不同線程之間傳遞數(shù)據(jù)。使用指針也可以完成數(shù)據(jù)的傳遞,但是指針非常危險,因為互斥量不能阻止指針的訪問;而且指針的方式傳遞的數(shù)據(jù)是固定的,如果更改數(shù)據(jù)類型,那么還需要更改有關(guān)的接口,比較麻煩

一、說明

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

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

要在未來設(shè)置一個值,您需要使用一個承諾,因為 boost::future 不提供成員函數(shù)來設(shè)置一個值。

二、示例

Boost.Thread 提供類 boost::promise,它有一個成員函數(shù) set_value()。您總是將 future 和 promise 成對使用。您可以使用 get_future() 從承諾中獲得未來。您可以在不同的線程中使用未來和承諾。如果在一個線程中的 promise 中設(shè)置了一個值,則可以在另一個線程中從 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

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

未來 f 和承諾 p 是相關(guān)聯(lián)的。當對未來調(diào)用 get() 時,將返回使用 set_value() 存儲在承諾中的值。因為該示例使用兩個線程,所以可能會在 accumulate() 調(diào)用 set_value() 之前在 main() 中調(diào)用 get()。在這種情況下,get() 會阻塞,直到使用 set_value() 將一個值存儲在 promise 中。

示例 44.14 顯示 10。

accumulate() 必須調(diào)整為在線程中執(zhí)行。它必須采用 boost::promise 類型的參數(shù)并將結(jié)果存儲在其中。示例 44.15 引入了 boost::packaged_task,這是一個將值從任何函數(shù)轉(zhuǎn)發(fā)到未來的類,只要該函數(shù)通過 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 與前一個類似,但這次沒有使用 boost::promise。相反,此示例使用類 boost::packaged_task,它與 boost::promise 一樣提供返回未來的成員函數(shù) get_future()。

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

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

雖然該示例擺脫了 boost::promise,但以下示例也沒有使用 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()。這個函數(shù)統(tǒng)一了 boost::packaged_task 和 boost::thread。它在新線程中啟動 accumulate() 并返回未來。

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

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

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

相關(guān)文章

  • C語言中程序環(huán)境和預處理的詳細圖文講解

    C語言中程序環(huán)境和預處理的詳細圖文講解

    這篇文章主要給大家介紹了關(guān)于C語言中程序環(huán)境和預處理的相關(guān)資料,我們寫的C語言代碼,從運行,到在屏幕上生成結(jié)果,經(jīng)歷了比較復雜的過程,需要的朋友可以參考下
    2023-02-02
  • C++&&Opencv實現(xiàn)控制臺字符動畫的方法

    C++&&Opencv實現(xiàn)控制臺字符動畫的方法

    這篇文章主要介紹了C++&&Opencv實現(xiàn)控制臺字符動畫的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 使用OpenCV實現(xiàn)檢測和追蹤車輛

    使用OpenCV實現(xiàn)檢測和追蹤車輛

    這篇文章主要為大家詳細介紹了使用OpenCV實現(xiàn)檢測和追蹤車輛,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解

    C++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解

    下面小編就為大家?guī)硪黄狢++聚合關(guān)系類的構(gòu)造函數(shù)的調(diào)用順序詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • 用標準c++實現(xiàn)string與各種類型之間的轉(zhuǎn)換

    用標準c++實現(xiàn)string與各種類型之間的轉(zhuǎn)換

    這個類在頭文件中定義, < sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。另外,每個類都有一個對應的寬字符集版本
    2013-09-09
  • 哈夫曼算法構(gòu)造代碼

    哈夫曼算法構(gòu)造代碼

    這篇文章主要介紹了哈夫曼算法構(gòu)造代碼,有需要的朋友可以參考一下
    2013-12-12
  • C#委托所蘊含的函數(shù)指針概念詳細解析

    C#委托所蘊含的函數(shù)指針概念詳細解析

    C#中用委托這種概念實現(xiàn)了函數(shù)指針技術(shù)而已,另外.ent提供額外的安全性,當然也損失了靈活性
    2013-09-09
  • C語言結(jié)構(gòu)體的具體使用方法

    C語言結(jié)構(gòu)體的具體使用方法

    這篇文章主要介紹了C語言結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C++菱形繼承及解決方法詳解

    C++菱形繼承及解決方法詳解

    這篇文章主要介紹了C++菱形繼承及解決方法詳解,在多繼承結(jié)構(gòu)中,存在著很多問題,比如從不同基類中繼承了同名成員,派生類中也定義了同名成員,這種二義性問題很好解決,加上要訪問的基類的類名限制就可以了,需要的朋友可以參考下
    2023-08-08
  • C++深入探究友元使用

    C++深入探究友元使用

    采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-07-07

最新評論