期货与承诺

2024-06-25

我对未来和承诺之间的区别感到困惑。

显然,他们有不同的方法和内容,但实际用例是什么?

Is it?:

  • 当我管理一些异步任务时,我使用 future 来获取“未来”的值
  • 当我是异步任务时,我使用 Promise 作为返回类型,以允许用户从我的 Promise 中获得未来

Future 和 Promise 是异步操作的两个不同方面。

std::promise由异步操作的“生产者/写入者”使用。

std::future由异步操作的“消费者/读取器”使用。

它被分成这两个单独的“接口”的原因是hide来自“消费者/读取器”的“写入/设置”功能。

auto promise = std::promise<std::string>();

auto producer = std::thread([&]
{
    promise.set_value("Hello World");
});

auto future = promise.get_future();

auto consumer = std::thread([&]
{
    std::cout << future.get();
});

producer.join();
consumer.join();

使用 std::promise 实现 std::async 的一种(不完整)方法可能是:

template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
    typedef decltype(func()) result_type;

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

    std::thread(std::bind([=](std::promise<result_type>& promise)
    {
        try
        {
            promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question.
        }
        catch(...)
        {
            promise.set_exception(std::current_exception());
        }
    }, std::move(promise))).detach();

    return std::move(future);
}

Using std::packaged_task这是一个助手(即它基本上完成了我们上面所做的事情)std::promise您可以执行以下更完整且可能更快的操作:

template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
    auto task   = std::packaged_task<decltype(func())()>(std::forward<F>(func));
    auto future = task.get_future();

    std::thread(std::move(task)).detach();

    return std::move(future);
}

请注意,这与std::async返回的地方std::future当被销毁时,将实际上阻塞,直到线程完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

期货与承诺 的相关文章

随机推荐

  • IE中是否有AJAX进度事件以及如何使用它?

    我尝试了所有我能想到的方法 至少可以实现 IE9 中的进度功能 但没有任何效果 所有其他浏览器都可以进入进度函数并编写测试文本 没有任何问题 希望有人能帮助我 谢谢你 var info document getElementById inf
  • .net 中的线程

    我有一个 winforms 应用程序的简单示例 我在目录选择器中选择一个目录 然后单击按钮循环遍历该目录并将目录中的每个文件复制到另一个目录中 我想在后台线程上进行文件复制以避免锁定 GUI 我正在寻找最简单的解决方案 创建后台线程 传递源
  • 语言之间的 Unicode 范围映射

    此链接列出了 7707 种语言http www sil org iso639 3 download asp http www sil org iso639 3 download asp and http en wikipedia org w
  • .NET 自然语言处理工具包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您能给我一些用于 NET 中自然语言处理的工具包和库吗 有类似 UIMA for NET 的工具吗 有SharpNLP http shar
  • Oracle数据库中的自增主键

    我想在 SQL Server 的列中实现标识或自动递增值 CREATE TABLE RollingStock Id NUMBER IDENTITY 1 1 Name Varchar2 80 NOT NULL 如何才能做到这一点 正如 Orb
  • 为什么阴谋集团重新安装“总是危险的”?

    使用 Cabal 重新安装软件包时 通常会看到以下警告 警告 请注意 重新安装总是很危险的 无论如何继续 此消息背后的一些原因是什么 目前 重新安装软件包意味着破坏性地覆盖已安装的软件包 如果旧包对系统有任何反向依赖性 它们将不再工作 为了
  • VS 2013 和 MSBuild

    我最近升级到 Visual Studio 2013 这在使用 MSBuild API 或带有命令行参数的可执行文件 进行外部构建时导致了连续问题 Issue 1使用 MSBuild 构建时 它不会生成单元测试所需的假程序集 这会导致构建失败
  • 构建 Flask docker 镜像时分配端口

    我最近使用 Flask 创建了一个应用程序 并将 py 文件放入 docker 容器中 然而 我对人们分配端口的在线案例感到困惑 首先在我写的 py 文件的底部 if name main app run host 0 0 0 0 port
  • 使用表单传递数组和用户输入

    我在处理传递数组的表单时遇到困难 我在名为 product 的数组中包含了 5 个变量 a b c d e 然后将其传递到另一个框架使用表单以及需要用户输入值的输入 所以会同时传递一个数组和一个输入 那么我应该使用 post 还是 get
  • MonoTouch 错误:升级到 iOS 5.1 后“未安装 Apple iPhone SDK”

    我已将 iOS 5 0 1 升级到 5 1 并且使用 MonoTouch 5 2 5 和 MonoDevelop 2 8 6 5 当我在 MonoDevelop 中创建示例应用程序时 它显示错误 Apple iphone sdk 未安装 如
  • 如何显示带有排序下拉列表的页面?

    我有一个选择列表
  • 为什么在相同大小的类型之间进行强制转换时,reinterpret_cast 不强制使用 copy_n?

    根据cppreference com http en cppreference com w cpp language reinterpret cast reinterpret cast 通过重新解释底层位模式在类型之间进行转换 但是等等 这
  • 从用户访问令牌获取应用程序 ID(或验证令牌的源应用程序)

    我找到了这个question http facebook stackoverflow com questions 6816568 extract app id and user id from facebook access token 其
  • 快速计算幂(例如 2^11)[重复]

    这个问题在这里已经有答案了 可能的重复 实现基于整数的幂函数 pow int int 的最有效方法 https stackoverflow com questions 101439 the most efficient way to imp
  • Flask 上下文处理器函数

    按照 Flask 页面上的最小示例 我尝试构建一个上下文处理器 上下文处理器 py def inflect this def inflectorize number word return format number inflectoriz
  • 在android上使用正则表达式验证字符串

    我希望我的字符串不包含 and 我用这个代码 private static boolean IsMatch String s String pattern try Pattern patt Pattern compile pattern M
  • 如何在 vite svelte 中加载 env 进行生产

    所以我是 Vite 的新手 我将它用于我的 svelte 应用程序 我真的不明白这部分文档 在生产过程中 这些环境变量会被静态替换 因此 有必要始终使用完整的静态字符串来引用它们 例如 像 import meta env key 这样的动态
  • OpenGL 中的 VBO 到底是什么?

    我正在尝试了解 OpenGL 背后的理论 目前正在研究 VBO 到目前为止我的理解是 当我们声明一系列顶点时 比如说形成一个三角形基元的 3 个顶点 我们基本上不会将它们存储在任何地方 它们只是在代码中声明 但是 如果我们想将它们存储在某个
  • 警报 Json 对象

    我有以下 json 对象 我需要通过 javascript 提醒它 data empmenuid 1 empid null deptid 66 aliasid 66 firstname 66 lastname 66 sin 66 statu
  • 期货与承诺

    我对未来和承诺之间的区别感到困惑 显然 他们有不同的方法和内容 但实际用例是什么 Is it 当我管理一些异步任务时 我使用 future 来获取 未来 的值 当我是异步任务时 我使用 Promise 作为返回类型 以允许用户从我的 Pro