網站首頁 編程語言 正文
一、說明
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,程序將終止。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127896736
相關推薦
- 2022-05-01 基于Python的Houdini插件開發過程詳情_python
- 2022-06-02 Python中函數的創建與調用你了解嗎_python
- 2022-06-21 使用Apache?Hudi?加速傳統的批處理模式的方法_Linux
- 2023-02-01 C語言中聯合體與共用體和枚舉使用語法示例_C 語言
- 2022-12-02 React?Hook中的useState函數的詳細解析_React
- 2023-01-10 CentOS7設置ssh服務以及端口修改方式_Linux
- 2022-12-11 詳解Android?GLide圖片加載常用幾種方法_Android
- 2023-05-15 Android?onMeasure與onDraw及自定義屬性使用示例_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支