亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

C++?Futures與Promises線程如何使用

發布時間:2022-11-21 09:28:51 來源:億速云 閱讀:105 作者:iii 欄目:開發技術

本篇內容主要講解“C++ Futures與Promises線程如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++ Futures與Promises線程如何使用”吧!

一、說明

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

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

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

二、示例

Boost.Thread 提供類 boost::promise,它有一個成員函數 set_value()。您總是將 future 和 promise 成對使用。您可以使用 get_future() 從承諾中獲得未來。您可以在不同的線程中使用未來和承諾。如果在一個線程中的 promise 中設置了一個值,則可以在另一個線程中從 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 的引用傳遞給執行 accumulate() 函數的線程 t。 accumulate() 計算 0 到 5 之間所有數字的總和并將其保存在 promise 中。在 main() get() 中調用 future 將總數寫入標準輸出。

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

示例 44.14 顯示 10。

accumulate() 必須調整為在線程中執行。它必須采用 boost::promise 類型的參數并將結果存儲在其中。示例 44.15 引入了 boost::packaged_task,這是一個將值從任何函數轉發到未來的類,只要該函數通過 return 返回結果即可。

示例 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 一樣提供返回未來的成員函數 get_future()。

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

boost::packaged_task 的優點是它在未來存儲函數的返回值。你不需要調整一個函數來在未來存儲它的值。 boost::packaged_task 可以看作是一個適配器,它可以存儲未來任何函數的返回值。

雖然該示例擺脫了 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() 被傳遞給函數 boost::async()。這個函數統一了 boost::packaged_task 和 boost::thread。它在新線程中啟動 accumulate() 并返回未來。

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

盡管 Boost 1.56.0 允許將 boost::launch::async 或 boost::launch::deferred 傳遞給 boost::async(),但尚未實現在當前線程中執行函數。如果您傳遞 boost::launch::deferred,程序將終止。

到此,相信大家對“C++ Futures與Promises線程如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

长丰县| 浪卡子县| 垣曲县| 安多县| 白玉县| 历史| 平潭县| 洛隆县| 全椒县| 德昌县| 简阳市| 图片| 威远县| 浏阳市| 巴南区| 虎林市| 鄢陵县| 越西县| 巴青县| 绥棱县| 抚州市| 深泽县| 高安市| 宁海县| 铜山县| 龙游县| 喀喇沁旗| 游戏| 平利县| 崇文区| 吴忠市| 潜江市| 静安区| 宁蒗| 湖南省| 木兰县| 铜川市| 芜湖市| 凭祥市| 徐汇区| 信阳市|