【问题标题】:How to comprehend "std::future shared state"?如何理解“std::future 共享状态”?
【发布时间】:2020-06-07 05:30:46
【问题描述】:

根据文档 (http://www.cplusplus.com/reference/future/future/get/),它说: [强调我的]

一旦共享状态准备就绪,函数就会解除阻塞并返回(或 throws) 释放它的共享状态。这使得未来的对象没有 更长时间有效:此成员函数最多应调用一次 每个未来的共享状态

根据文档 (http://www.cplusplus.com/reference/future/future/),它说: [强调我的]

“有效”期货是与共享状态关联的未来对象,并且 通过调用以下函数之一构造

异步

promise::get_future

packaged_task::get_future

根据文档 (http://www.cplusplus.com/reference/future/future/get/),它说: [强调我的]

std::future::get

通用模板 (1) T get();参考

专业化(2)R&future::get(); // 当 T 是引用时

type (R&) void 特化 (3) void future::get(); // 当 T 为空时

返回:

value 通常为 (1),std::move(x),其中 x 是存储在 共享状态 中的值。

对于引用 (2),对存储在 共享状态 中的值的引用。

对于无效期货 (3),什么都没有。

我的问题是什么是“std::future 共享状态”?如何理解“std::future shared state”?

我是C++的新手。虽然我想了又想,但我仍然无法掌握这个想法。如果能在这个问题上得到一些帮助,我将不胜感激。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    根据std::future 上的cppreference 文档:

    当异步操作准备好向创建者发送结果时,它可以通过修改链接到创建者的 std::future 的共享状态(例如 std::promise::set_value)来做到这一点。

    这里的共享状态是指一些可变的东西可以被多个线程读取/写入。直接考虑文档中的示例:

    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread([&p]{ p.set_value_at_thread_exit(9); }).detach();
    f.wait();
    

    主线程和创建的线程共享p(并且由于p 是有状态的,它们共享状态!)。在 lambda 体内调用 std::promise::set_value_at_thread_exit 可以有效地修改这两个线程之间的共享状态。基本上就是这个意思。

    promise 给出的std::future 表示共享状态的“有趣”部分——你关心的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多