【问题标题】:boost::asio::io_service::run does not return while having no workboost::asio::io_service::run 在没有工作时不返回
【发布时间】:2015-06-06 14:51:27
【问题描述】:

来自 Asio 文档

run() 函数一直阻塞,直到所有工作完成并且没有更多的处理程序要分派,或者直到 io_service 已停止。

在下面的 sn-p Asio 中除了调试输出(立即计算)之外没有任何工作,但 run() 不返回。

#define BOOST_ASIO_ENABLE_HANDLER_TRACKING

#include <iostream>
#include <thread>

#include <boost/asio.hpp>

int main()
{
  namespace asio = boost::asio;

  asio::io_service ios;

  asio::ip::udp::endpoint ep(boost::asio::ip::udp::v4(), 9876);
  auto socket = new asio::ip::udp::socket(ios, ep);
  std::thread th([&]
  {
      ios.dispatch([]{ std::cout << "before run()" << std::endl;});
      ios.run();
      std::cout << "after run()" << std::endl;
  });

  std::this_thread::sleep_for(std::chrono::seconds(5)); // wait for io_service to launch

  socket->cancel();
  socket->close();
  delete socket; // just in case

  std::cout << "socket is closed" << std::endl;

  th.join(); // hangs here

  std::cout << "exiting..." << std::endl;
}

挂起前的输出是

@asio|1433598048.101578|0*1|io_service@0x611000009f00.dispatch
@asio|1433598048.101785|>0|
before run()
socket is closed

没有套接字,这个 sn-p 工作得很好。

我使用的是 Ubuntu 15.04,我尝试了 gcc-4.9.2、gcc-5.1、clang-3.6、boost-1.56 和 boost-1.58。

这是一个错误吗?如果是,是否有任何解决方法,或者我只是误解了什么?

更新
此错误仅使用以下文件重现,必须在其他翻译单元中与上述 sn-p 一起编译:

#include <boost/asio.hpp>

namespace asio = boost::asio;

class my_server
{
public:
  my_server(asio::io_service& ios);

private:

  asio::io_service& _ios;
  asio::ip::udp::socket _socket;
};

my_server::my_server(boost::asio::io_service &ios)
  : _ios(ios), _socket(ios, asio::ip::udp::endpoint())
{
}

我在https://github.com/shadeware/asio-problem 创建了最小项目

【问题讨论】:

  • 您的逐字代码适用于我在 OS X (10.10.3) 上使用 clang 3.6 和 Debian 8 上使用 gcc 4.9。在记录 cancel()close() 之前,它会暂停几秒钟,但随后会按预期完成。

标签: c++ c++11 boost boost-asio


【解决方案1】:

显然,如果您选择定义BOOST_ASIO_ENABLE_HANDLER_TRACKING,那么您必须在所有boost::asio 翻译单元中这样做。我没有在文档中看到这一点,但我确实在 Boost mailing list 上找到了它。

当我添加时

add_definitions(-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)

到你的CMakeLists.txt,所以它被全局应用然后我看不到挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多