如何在boost :: asio线程池中创建任务可取消/可中断?

时间:2012-05-29 08:56:09

标签: c++ multithreading boost threadpool boost-asio

我有来自this之类食谱的boost::asio::io_service线程池。我想知道如何中断发布到它的任务(不杀死线程),以便它们将被替换为池中的下一个任务?

1 个答案:

答案 0 :(得分:1)

一般来说,boost :: asio中的回调应该相当快。他们应该做一些工作,安排另一个工作并完成。这将是任务失去CPU的点,其他任务将被执行。

boost::thread::interrupt()boost::thread_group::interrupt_all(),但他们只能在中断点停止执行线程。中断将被视为例外boost::thread_interrupted。这意味着,您必须以某种方式处理异常,并在您的情况下 - 释放当前任务。它比处理剩余的处理和调度处理程序的步骤要复杂得多。

此外,您可以在执行自己的例程的线程中使用interrupt()interrupt_all(),而对于运行io_service::run()的线程则不是这种情况。可以想象,boost::thread_interrupted被抛出run()方法,而不是异步处理程序,这可能以意外行为结束。