并发支持库(5)-future

std::future是c++种的一个模板类,它提供了一种方式来异步获取一个操作的结果。std::future通常配合std::promise、std::packaged_task、std::async使用。

std::future提供了get接口用于获取操作结果,调用get会阻塞当前线程直接结果可用。valid接口用于检查future是否拥有共享状态。wait、wait_for、wait_until接口用于等待操作结果。

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

promise

promise用于存储一个值或者异常,promise提供get_future用于返回关联的future对象。调用关联future的get接口将阻塞直到结果可用(即,直到promise调用set_value或者set_exception)。代码示例:

std::promise<int> promise;
std::future<int> future = promise.get_future();

auto Func = [](std::promise<int> p)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    p.set_value(42);
};

std::jthread t(Func, std::move(promise));
int val = future.get();
std::cout << "val = " << val << std::endl;

输出结果:

val = 42

package_task

类模板package_task可以包装任何可调用对象,使之可以异步调用(同步也可以),并且可调用对象的返回值或者异常结果关联在future中。代码示例:

auto Func = [](int val) -> int
{
    return val;
};

std::packaged_task<int(int)> task1(Func);
std::packaged_task<int(int)> task2(Func);
std::future<int> f1 = task1.get_future();
std::future<int> f2 = task2.get_future();

task1(10);
std::jthread t(std::move(task2), 42);

int val1 = f1.get();
int val2 = f2.get();
std::cout << "val1 = " << val1 << std::endl;
std::cout << "val2 = " << val2 << std::endl;

输出结果:

val1 = 10
val2 = 42

async

std::async是一个函数模板,它异步得(也可以是同步)执行函数或者函数对象,并返回一个future对象用于获取函数的返回值:

<class Fty, class... ArgTypes>
future async(launch Policy, Fty&& Fnarg, ArgTypes&&... Args)

其中Policy是一个策略参数。如果为std::launch::async,那么要求函数在新线程上执行;如果为std::launch::deferred,那么直到调用std::future::get或者std::future::wait时才执行,执行的线程可能和调用线程相同;如果为std::launch::async | std::launch::deferred,由系统决定是否异步执行。

代码示例:

auto Func = []() -> std::thread::id
{
    return std::this_thread::get_id();
};

std::future f1 = std::async(std::launch::async, Func);
std::future f2 = std::async(std::launch::deferred, Func);
std::future f3 =
    std::async(std::launch::async | std::launch::deferred, Func);

std::cout << "main thread: " << std::this_thread::get_id() << std::endl;
std::cout << "f1: " << f1.get() << std::endl;
std::cout << "f2: " << f2.get() << std::endl;
std::cout << "f3: " << f3.get() << std::endl;

可能的输出结果:

main thread: 105036
f1: 130644
f2: 105036
f3: 130644

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值