Boost:触发并忘记异步函数调用?

Boost: Fire and forget asynchronous function call?

提问人:JeffV 提问时间:10/1/2008 最后编辑:C. K. YoungJeffV 更新时间:10/1/2008 访问量:4818

问:

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

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

C++ Boost 异步

评论


答:

0赞 KeyserSoze 10/1/2008 #1

也许你想发出一个信号?

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

评论

0赞 Jim Crafton 10/1/2008
唯一的问题是,这可能无法异步工作,如果这样做,那么它可能需要设置一个事件循环来将信号“发布”到循环中。否则,你就会回到只是把它扔到一个线程上而忘记它。
3赞 Greg Rogers 10/1/2008 #2

好吧,你可以启动一个线程,然后再也不会加入它。像这样:

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

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

3赞 David Smith 10/1/2008 #3

我已经有一段时间没有使用boost::thread了,但是我在该类的文档页面上看到了一个快速示例:

void find_the_question(int the_answer);

boost::thread deep_thought_2(find_the_question,42);

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

1赞 Eclipse 10/1/2008 #4

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

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

看看这个项目,了解一种方法。

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