boost :: asio - asio_handler_deallocate вызывается в io_service :: ~ io_service (), после io_service :: stop ()

У меня есть ip :: udp :: socket , созданный с помощью io_service . Есть только один boost :: thread , который вызывает метод io_service :: run () , и экземпляр io_service :: work для предотвращения io_service :: run () от возврата. Обработчики завершения для моего ip :: udp :: socket имеют пользовательские функции asio_handler_allocate () и asio_handler_deallocate () , которые поддерживаются my :: custom_memory_pool .

Когда мое приложение завершает работу, эта последовательность событий происходит в моем завершающем потоке:

  1. ip :: udp :: socket :: close ()
  2. work :: ~ work ()
  3. io_service :: stop ()
  4. thread :: join ()
  5. my :: custom_memory_pool :: ~ custom_memory_pool ()
  6. ip :: udp :: socket :: ~ socket ()
  7. thread :: ~ thread ()
  8. io_service :: ~ io_service ()

На шаге 8 вызов io_service :: ~ io_service () вызывает ...

Program terminated with signal 11, Segmentation fault.
#0  0x00000000005ad93c in my::custom_memory_pool<boost::aligned_storage<512u, -1u> >::deallocate (this=0x36323f8, t=0x7fca97a07880)
    at memory.hpp:82
82                      reinterpret_cast<pool_node*>(t)->next_ = head_;
(gdb) bt 30
#0  0x00000000005ad93c in my::custom_memory_pool<boost::aligned_storage<512u, -1u> >::deallocate (this=0x36323f8, t=0x7fca97a07880)
    at memory.hpp:82
#1  0x00000000005ad40a in asio_handler_deallocate (p=0x7fca97a07880, s=96, h=0x7fffe09d5480) at net.cpp:22
#2  0x0000000000571a07 in boost_asio_handler_alloc_helpers::deallocate<socket_multicast::completion_handler> (p=0x7fca97a07880, s=96, h=...)
    at /usr/include/boost/asio/detail/handler_alloc_helpers.hpp:51
#3  0x0000000000558256 in boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, socket_multicast::completion_handler>::ptr::reset (this=0x7fffe09d54b0)
    at /usr/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp:81
#4  0x0000000000558310 in boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, socket_multicast::completion_handler>::do_complete (owner=0x0, base=0x7fca97a07880)
    at /usr/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp:112
#5  0x0000000000426706 in boost::asio::detail::task_io_service_operation::destroy (this=0x7fca97a07880)
    at /usr/include/boost/asio/detail/task_io_service_operation.hpp:41
#6  0x000000000042841b in boost::asio::detail::task_io_service::shutdown_service (this=0xd4df30)
    at /usr/include/boost/asio/detail/impl/task_io_service.ipp:96
#7  0x0000000000426388 in boost::asio::detail::service_registry::~service_registry (this=0xd4a320, __in_chrg=<value optimized out>)
    at /usr/include/boost/asio/detail/impl/service_registry.ipp:43
#8  0x0000000000428e99 in boost::asio::io_service::~io_service (this=0xd49f38, __in_chrg=<value optimized out>)
    at /usr/include/boost/asio/impl/io_service.ipp:51

Итак, io_service: : ~ io_service () пытается освободить часть памяти пулу, который я уничтожил на шаге 5.

Я не могу переместить my :: custom_memory_pool :: ~ custom_memory_pool () в после io_service :: ~ io_service () .

Я ожидал, что после возврата io_service :: stop () и thread :: join () больше не может быть вызовов asio_handler_deallocate () . Видимо дело не в этом. Что я могу сделать на шаге 3, чтобы заставить io_service исключить из очереди все свои события завершения и освободить всю память обработчика, и как я могу заблокировать, пока io_service не завершит эти задачи?

]
6
задан Sam Miller 21 March 2013 в 01:49
поделиться