2022-08-14 C++并发编程(十一)


前言

在并发编程中,std::future 只可移动不可复制,有明确的所有权,但若多个线程同时需要访问一个 std::future 对象,会出现问题,std::shared_future 可很好的解决此问题。


一、std::future 和 std::shared_future 间归属权转移

std::future 只可移动,转移所有权可以用函数返回值 get_future() 或 std::move()函数。

std::future 也可直接用成员函数 shared() 创建 std::shared_future 并转移归属权。

通过 valid() 成员函数判断各自状态的有效性。

#include <cassert>
#include <future>
#include <iostream>

auto main() -> int
{
    std::promise<int> pShared;
    auto fShared = pShared.get_future().share();

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

    p.set_value(5);
    assert(f.valid());

    std::shared_future<int> sf(std::move(f));

    assert(!f.valid());
    assert(sf.valid());
    //  std::cout << f.get() << std::endl;
    std::cout << sf.get() << std::endl;

    return 0;
}

二、std::shared_future 的使用

std::shared_future 可以进行拷贝,多个拷贝的 std::shared_future 对象可分别使用 get() 函数。

#include <cassert>
#include <future>
#include <iostream>
#include <string>

auto main() -> int
{
    std::promise<std::string> pShared;

    auto sharedFuture1 = pShared.get_future().share();
    const auto &sharedFuture2 = sharedFuture1;

    pShared.set_value("const string &__r");

    std::cout << sharedFuture1.get() << sharedFuture2.get() << std::endl;

    return 0;
}

总结

对于有所有权需求的程序,std::future 可以满足需求,对于需要多线程共享数据的,std::shared_future 可满足需求。

参考文献:C++并发编程实战(第2版)[英] 安东尼•威廉姆斯(Anthony Williams)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不停感叹的老林_<C 语言编程核心突破>

不打赏的人, 看完也学不会.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值