【问题标题】:Could not unblock the boost asio acceptor无法解锁升压 asio 接受器
【发布时间】:2014-08-05 08:03:39
【问题描述】:

我正试图取消一个 TCP 接受器,但程序一直在该行阻塞。

一个线程等待这样的连接:

boost::system::error_code ec;
acceptor_ = new boost::asio::ip::tcp::acceptor(io_service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
acceptor_->accept(socket_, ec);  // socket_ is a boost::asio::ip::tcp:socket

必须关闭接受器的线程:

boost::system::error_code ec;
acceptor_->close(ec);

我有什么遗漏吗?我没有使用任何异步操作,所以我可以对 io_service 对象做点什么吗?

【问题讨论】:

  • 您可以在关闭它之前尝试使用acceptor_->cancel();。我在我的程序中使用它,它工作正常。但是我认为close() 也应该可以工作。你确定你在处理同一个接受器对象吗?
  • 是的,当然是同一个接受者。我的代码可以在 Windows 上运行,但不能在 Linux 上运行,有什么想法吗?
  • close() 阻塞时的堆栈跟踪是什么?为什么要取消 another thread
  • 为什么不能从另一个线程取消接受者?我的意思是,如果接受是一个阻塞操作,我如何从同一个线程中取消它?

标签: c++ sockets boost tcp boost-asio


【解决方案1】:

简而言之,您无法使用 asio 函数和方法取消大多数异步操作。

问题在于acceptread 等是系统调用。它们不能使用io_service::stopcancel 中断,因为接受线程在系统调用中被阻塞,而不是在 asio 事件循环中。它们只能通过杀死线程或发送信号来中断。

我更愿意让这个接受器异步,这样问题就解决了。另请参阅this Q on SO 关于此

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多