【问题标题】:Boost.Asio: Could I cancel a SYNCHRONOUS operation running in a secondary thread?Boost.Asio:我可以取消在辅助线程中运行的同步操作吗?
【发布时间】:2015-07-17 10:07:57
【问题描述】:

我正在使用 Boost.Asio 和 Boost.Thread。如何取消辅助线程中的同步 IO 操作? 例如,

/* consider needed headers included and typedefs are defined */

void OperationThread(sock_ptr sock) {
  char buf[128];
  boost::system::error_code ec;
  boost::asio::read(*sock, boost::asio::buffer(buf, 128), ec);
}

void AcceptorThread() {
  boost::asio::io_service serv;
  boost_asio_endpoint_type ep( ... /* v4() etc. */ , ... /* port */ );
  boost_asio_acceptor_type acc(serv, ep);
  sock_ptr sock(new boost_asio_socket_type(serv));
  while (true) {
    acc.accept(*sock);
    boost::thread t(boost::bind(&OperationThread, sock)); // new thread
    sock.reset(new boost_asio_socket_type(serv)); // new socket
  }
}

int main() {
  boost::thread accthread(&AcceptorThread);
  cin.get();
  // Code to cancel synchronous accept operation and read operations
  return 0;
}

sock_ptrboost::shared_ptr<boost_asio_socket_type> 的类型定义。

如果您对 boost_asio_*_type 感到困惑,请考虑为 boost::asip::ip::tcpv4() 配置。

首先我习惯使用异步操作。但是你知道它们有点难以管理。我想要每个连接一个线程的应用程序模型。使用异步 IO 实现起来比较困难(其实我也不知道怎么实现,如何在线程中轮询特定的异步操作?,如果你提到我会很高兴。)。所以我使用同步IO。

在我的代码中,你会注意到,我的线程对象在 while 块的末尾被销毁。它有什么害处吗? (对不起,我知道在这个问题上问这个问题不合适,但是任何想做我想做的事情的人都可能面临这个问题。所以如果你回答,我会很高兴。ʘ‿ʘ)

谢谢。

【问题讨论】:

  • Asio 不提供取消同步操作的方法(有关类似问题,请参阅此answer)。另外,如果有人正在为异步编程的反向流控制而苦苦挣扎,那么我强烈建议使用 Asio 的协程支持(参见 answer)。

标签: c++ multithreading networking boost boost-asio


【解决方案1】:

可以,只要您正确同步对服务对象的访问(例如boost::asio::ip::tcp::socketboost::asio::deadline_timer)¹。

此外,在您的代码中,您将使用来自不同线程的shared_ptr<>。共享指针本身不是线程安全的。尽管您可以将the atomic_load and atomic_store functions 与它们一起使用以使其成为线程安全的。


¹ 该文档揭示了对象是线程安全的(例外)情况。我能从记忆中引用的唯一两个是boost::asio::io_serviceboost::asio::strand

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多