一:概述
? ? ? ? std::promise 和 std::future 是C++標準庫的兩種工具,主要用于實現線程之間的異步通信。它們屬于C++并發庫的一部分,提供了一種安全,優雅的方式來在線程之間傳遞結果或狀態。
二:std::promise 介紹
? ? ? ? std::promise 用于在線程之間傳遞值或狀態,是一種能夠在一個線程中存儲值(或異常)的對象。
? ? ? ? 常用方法有以下幾種:
? ? ? ? set_value(value)? 設置異步操作的結果,通知關聯的std::future.?
? ? ? ? set_exception(ex) 設置一個異常,通知關聯的 std::future 發生錯誤
? ? ? ? get_future() 獲取該 promise 關聯的 future 對象,用于結果的獲取
三:std::future 介紹
? ? ? ? std::future 提供了一個從異步任務中獲取值的機制,它是一個可以從另一個線程獲取值(或異常)的對象。
? ? ? 常用方法有以下幾種:
? ? ? get()? ? 獲取異步任務的結果(如果有異常會拋出)
? ? ? wait()? 阻塞當前線程,直到異步任務完成。
? ? ? wait_for() 等待指定的時間,返回任務是否完成(非阻塞)
? ? ? valid() 檢查 future 是否有效,表示是否能獲取結果。?
四:例子
#include <iostream>
#include <future>
#include <thread>
#include <chrono>using namespace std::literals::chrono_literals; void getAnswer(std::promise<int> intPromise)
{std::this_thread::sleep_for(5s);intPromise.set_value(10);
}int main()
{std::promise<int> answerPromise;auto fut = answerPromise.get_future();std::thread workerThread(getAnswer, std::move(answerPromise)); std::future_status status{};do{status = fut.wait_for(0.5s);std::cout << "main thread doing something..." << '\n';} while (status != std::future_status::ready);std::cout << "answer: " << fut.get() << '\n';workerThread.join();return 0;
}