【问题标题】:How do I execute a C++ function asynchronously and not block/wait?如何异步执行 C++ 函数而不是阻塞/等待?
【发布时间】:2014-05-27 12:28:34
【问题描述】:

我想异步执行一个函数,而不是等待它完成。我最初以为我可以将 std::async 与 launch::async 一起使用,但返回的未来的析构函数会阻塞,直到函数完成。

有没有办法使用 stl 在线程池上运行函数而不阻塞?

【问题讨论】:

  • 什么样的功能?它有什么作用,运行时间、运行次数和频率?
  • std::thread::detach 可能会有所帮助。
  • @John Zwinck - 该函数执行我不想阻止 UI 的后台任务。
  • @Jarod42 - 也许这会有所帮助。不过,这是否会每次都启动一个新线程。我认为 std::async 可能会使用一个线程池,我可以使用它而无需启动新线程且无需阻塞。
  • @ScottLangham:你忽略了我的大部分澄清问题。

标签: c++ stl


【解决方案1】:

您应该生成一个等待计数信号量的新线程。当它被唤醒(解除阻塞)时,它将发送一个 RPC 请求并递减计数器。当用户单击按钮时,增加计数器。同一个线程可以在程序的整个生命周期内为所有请求提供服务。

【讨论】:

    【解决方案2】:

    您正在寻找 std::thread::detach。 http://en.cppreference.com/w/cpp/thread/thread/detach

    您可以创建一个线程,然后从中分离。此时你可以删除你的线程句柄,线程将在没有你的情况下运行。

    顺便说一句,使用这种技术通常被认为是不好的形式。通常你应该关心线程的状态,并且应该尝试在程序结束时优雅地关闭它,但实际上,当你真的不关心时,这是一个有用的技巧。

    【讨论】:

      【解决方案3】:

      这个提案谈到了执行者......看起来我希望我会发现已经存在的那种东西,但它看起来并不存在。

      http://isocpp.org/files/papers/n4039.html

      【讨论】:

        猜你喜欢
        • 2019-09-24
        • 2020-01-17
        • 2021-12-12
        • 1970-01-01
        • 2022-01-04
        • 2023-03-28
        • 2019-12-30
        • 2016-03-13
        • 1970-01-01
        相关资源
        最近更新 更多