我在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之间快速切换) 但是当'峰值负载'通过时,我需要一些方法来阻止其他线程。对此有什么解决方案吗?
答案 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
异常。