boost::asio io_service thread pool with io_service::work



我有一个boost :: asio threadpool,它具有 asio::io_serviceasio::work
boost::asio::io_service m_service;
boost::asio::io_service::work m_work;
在ThreadPool Destructor中,我正在调用m_service.stop(),然后加入所有线程。但是,在过程关闭期间(在ThreadPool Destructor中(间歇性地陷入了此崩溃:


    #0  0x0000000000000000 in ?? ()
    #1  0x00007f4c8e59d160 in boost::asio::detail::task_io_service_operation::destroy (
        this=0x6d579f8)
        at /home/depot/Boost_1_61_0/boost/asio/detail/task_io_service_operation.hpp:43
    #2  0x00007f4c8e59d115 in boost::asio::detail::op_queue_access::destroy (o=0x6d579f8)
        at /home/depot/Boost_1_61_0/boost/asio/detail/op_queue.hpp:47
    #3  0x00007f4c8e59d044 in boost::asio::detail::op_queue::~op_queue (this=0x6d57a20)
        at /home/depot/Boost_1_61_0/boost/asio/detail/op_queue.hpp:81
    #4  0x00007f4c8e685d65 in boost::asio::detail::task_io_service::~task_io_service (
        this=0x6d57960)
        at /home/depot/Boost_1_61_0/boost/asio/detail/task_io_service.hpp:40
    #5  0x00007f4c8e685dc9 in boost::asio::detail::task_io_service::~task_io_service (
        this=0x6d57960)
        at /home/depot/Boost_1_61_0/boost/asio/detail/task_io_service.hpp:40
    #6  0x00007f4c8e5aa1ce in boost::asio::detail::service_registry::destroy (
        service=0x6d57960)
        at /home/depot/Boost_1_61_0/boost/asio/detail/impl/service_registry.ipp:101
    #7  0x00007f4c8e68537c in boost::asio::detail::service_registry::~service_registry (
        this=0x6d55020)
        at /home/depot/Boost_1_61_0/boost/asio/detail/impl/service_registry.ipp:45
    #8  0x00007f4c8e6852b0 in boost::asio::io_service::~io_service (
        this=0x7f4c8eb169c8 )
        at /home/depot/Boost_1_61_0/boost/asio/impl/io_service.ipp:53
    #9  0x00007f4c8e71d295 in crossplat::threadpool::~threadpool (
        this=0x7f4c8eb169b0 )
        at /home/depot/include/threadpool.h:87
    #10 0x00007f4c8aed6fe8 in __run_exit_handlers (status=0,
    ---Type  to continue, or q  to quit---
        listp=0x7f4c8b2605f8 , run_list_atexit=run_list_atexit@entry=true)
        at exit.c:82
    #11 0x00007f4c8aed7035 in __GI_exit (status=) at exit.c:104
    #12 0x00007f4c8aebd837 in __libc_start_main (main=0x1ce0980 ,
        argc=3, argv=0x7fffee2eda98, init=, fini=,
        rtld_fini=, stack_end=0x7fffee2eda88) at ../csu/libc-start.c:325
    #13 0x0000000001cdf159 in _start () at /usr/include/c++/v1/string:2027
 

ASIO文档建议明确销毁asio::work对象,以使所有处理程序正常完成。问题:

  1. 明确破坏ASIO :: Work对象后需要致电io_service::stop()
  2. io_service::stop()和破坏io_service::work
  3. 有什么区别
  4. 此ThreadPool Destructor看起来正确,它可以帮助修复上述崩溃。我已将M_Work更改为指针std::unique_ptr<boost::asio::io_service::work> m_work;
    ~threadpool()
    {
    m_work.reset(); // Allow io_service::run to exit
    // join all threads
    }

明确破坏ASIO :: Work对象后,是否需要致电IO_Service :: stop((?

否。如果没有更多的工作,该服务将完成(民意调查/运行将返回(。

io_service :: stop((和破坏io_service :: work

有什么区别

工作只是释放锁,允许服务完成。

io_service::stop()强行停止事件循环,即使仍在工作待处理。

这款ThreadPool驱动器看起来正确,它可以帮助修复上述崩溃。

是的,驱动器应加入所有线程。您的代码没有显示它,所以我建议验证您这样做。

想法

我注意到threadpool正在从出口处理程序中销毁。对我来说,这意味着ThreadPool可能具有静态存储持续时间。如果它也取决于其他任何内容(例如,也许是静态io_service实例?(,您可以跑入SIOF:静态初始化顺序fiasco。

相关内容