【问题标题】:Boost: Fire and forget asynchronous function call?Boost:触发并忘记异步函数调用?
【发布时间】:2010-09-14 09:28:14
【问题描述】:

我想以一次性方式调用函数。在 Boost / C++ 中执行此操作的最佳方法是什么?

我想传递两个参数,不需要结果。

【问题讨论】:

    标签: c++ boost asynchronous


    【解决方案1】:

    也许你想发出一个信号?

    我真的很喜欢 Qt 的信号和槽功能,而且我知道 Boost 也有信号/槽。不过,我从未在 Boost 中使用过信号/插槽。

    【讨论】:

    • 唯一的问题是这可能无法异步工作,如果可以,则可能需要设置一个事件循环来将信号“发布”到循环中。否则你又会回到只是把它扔到一个线程上然后忘记它。
    【解决方案2】:

    你可以启动一个线程,然后再也不加入它。比如:

    boost::thread some_thread(&SomeFunction, param1, param2);
    

    一旦 some_thread 变量超出范围,执行线程将被分离,并且无法再次加入。除非这个函数的处理时间很长,否则启动线程是一种浪费。

    【讨论】:

      【解决方案3】:

      我有一段时间没有使用 boost::thread,但我在 documentation page for the class 上看到了一个简单的示例:

      void find_the_question(int the_answer);
      
      boost::thread deep_thought_2(find_the_question,42);
      

      我相信一旦它完成函数,线程就会退出。这可能不是您想要的,因为一旦线程超出范围,它将被销毁。如果这不起作用,您可能需要创建一个长时间运行的线程池,然后将您的仿函数作为 boost::bind 组合传递。

      【讨论】:

        【解决方案4】:

        根据您执行此操作的频率,您最好创建一个线程池以及一个工作队列。如果您尝试每秒执行数十次线程,则创建线程会产生大量开销。如果您不关心返回值,那就很容易了。

        旋转一两个(或十个)线程;有一个线程安全的函子队列来调用(将参数绑定到函数并将其放入队列中);线程在队列中等待某些东西出现,第一个唤醒的线程开始处理工作。当一个线程完成运行作业时,它会再次在队列中等待。

        查看this project,了解一种方法。

        当然,如果您只是每隔几秒钟进行一次异步调用以提高 UI 的响应能力,那么每次都启动一个新线程会更容易。

        【讨论】:

          猜你喜欢
          • 2020-04-25
          • 2014-12-06
          • 1970-01-01
          • 2016-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-05
          • 2013-09-01
          相关资源
          最近更新 更多