boost::asio io_service 停止特定线程

Posted

技术标签:

【中文标题】boost::asio io_service 停止特定线程【英文标题】:boost::asio io_service stop specific thread 【发布时间】:2013-08-09 09:20:40 【问题描述】:

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

_workers.emplace_back(srv::unique_ptr<srv::thread>(new srv::thread([this]

    _service.run();
)));

(srv命名空间用于在boost和std之间快速切换) 但是当“峰值负载”通过时,我需要一些方法来停止额外的线程。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

您正在寻找的是一种中断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 异常。

【讨论】:

以上是关于boost::asio io_service 停止特定线程的主要内容,如果未能解决你的问题,请参考以下文章

Boost::Asio : io_service.run() vs poll() 或者我如何在主循环中集成 boost::asio

boost::asio::io_service类

boost::asio::io_service 运行方法阻塞/解除阻塞时感到困惑

Boost Asio总结 io_service

C++ boost::asio::io_service创建线程池thread_group简单实例

C++ boost::asio::io_service创建线程池thread_group简单实例