boost :: asio io_service停止特定的线程

时间:2013-08-09 09:20:40

标签: threadpool boost-asio

我在N个线程上运行了一个基于boost :: asio的线程池。 它主要用于IO任务(DB数据存储/ retreival)。它还启动自我诊断计时器作业以检查“繁忙”池是如何(计算'添加时间'和'时间处理程序'之间的ms差异) 所以问题是 - 有没有办法阻止N个线程中的M(对于负载非常低且池不需要这么多线程的情况)。 当负载很高(由诊断任务确定)时,则添加新线程:

_workers.emplace_back(srv::unique_ptr<srv::thread>(new srv::thread([this]
{
    _service.run();
})));

(srv命名空间用于在boost和std之间快速切换) 但是当'峰值负载'通过时,我需要一些方法来阻止其他线程。对此有什么解决方案吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找的是一种中断等待io_service的线程的方法。您可以使用异常实现某种中断机制。

class worker_interrupted : public std::runtime_error
{
public:
    worker_interrupted() 
    : runtime_error("thread interrupted") {}
};


_workers.emplace_back(srv::unique_ptr<srv::thread>(new srv::thread([this]
{
    try
    {
        _service.run();
    }
    catch (const worker_interrupted& intrruption)
    {
        // thread function exits gracefully.
    }

})));

然后,您可以使用io_service::post将完成处理程序排入队列,该处理程序只会抛出worker_interrupted异常。