std::promise 和 std::future 配合,可实现异步求值,提供数据的线程利用 std::promise 设置值,等待数据的线程会在 std::future 上阻塞线程,直到提供数据的线程设置关联值后,std::future 就绪。
一个简单的示例,计算平方根,main 中开启新线程 doing ,doing中通过共享promise取得 std::future
#include
#include
#include
#include
#include
#include
auto squareRoot(double x) -> double
{
return sqrt(x);
}
auto calculateValue(double x) -> double
{
return squareRoot(x);
}
extern std::promise<double> somePromise;
void printValue()
{
std::future<double> test = somePromise.get_future();
std::cout << test.get() << std::endl;
}
auto main() -> int
{
std::thread doing(printValue);
somePromise.set_value(calculateValue(1.2));
doing.join();
return 0;
}
std::promise<double> somePromise;
std::future 也可保存异常,通过std::promise设置值,如抛出异常,则捕获后通过 set_exception() 函数将异常保存至 std::future。
#include
#include
#include
#include
#include
#include
auto squareRoot(double x) -> double
{
if (x < 0)
{
throw std::out_of_range("x<0");
}
return sqrt(x);
}
auto calculateValue(double x) -> double
{
return squareRoot(x);
}
extern std::promise<double> somePromise;
auto main() -> int
{
// std::future f = std::async(squareRoot, -1);
// double y = f.get();
try
{
somePromise.set_value(calculateValue(-1.2));
}
catch (...)
{
// somePromise.set_exception(
// std::make_exception_ptr(std::logic_error("fool")));
somePromise.set_exception(std::current_exception());
}
std::future<double> test = somePromise.get_future();
std::cout << test.get() << std::endl;
return 0;
}
std::promise<double> somePromise;
std::promise 和 std::future 的配对使用可以通过 promise 传值,future 获取,在线程间传递数据,同时future也可保存异常。