【问题标题】:Boost asio not able to run io service on all threads., io service is blocking at first thread callBoost asio 无法在所有线程上运行 io 服务。,io 服务在第一次线程调用时阻塞
【发布时间】:2018-09-19 15:22:38
【问题描述】:

我正在尝试按照示例创建多线程服务器 HTTP Server 3。我已经按照示例中所示进行了操作。

用于创建线程的服务器代码。 版本 1

for (std::size_t i = 0; i < thread_pool_size_; ++i) {
    boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &ios_)));
    threads_.push_back(thread);
  }
  for (std::size_t i = 0; i < threads_.size(); ++i){
        LOGV << "performing join operation for thread = "<< i;
    threads_[i]->join();
  }

第 2 版

for (std::size_t i = 0; i < thread_pool_size_; ++i) {
  boost::shared_ptr<boost::thread> thread(new boost::thread(
    [this](){ LOGV << "Intiating thread"; this->ios_.run(); }));
    threads_.push_back(thread);
  }
  for (std::size_t i = 0; i < threads_.size(); ++i){
        LOGV << "performing join operation for thread = "<< i;
    threads_[i]->join();
  }

版本 1 给了我输出:

执行线程 = 0 的连接操作

版本 2 为我提供了以下 10 个线程的输出。

[Tcp::Server::run@76] 启动线程 启动线程
启动线程
启动线程
启动线程
启动线程
启动线程
启动线程
启动线程
为 thread = 0 执行连接操作
启动线程
启动线程

我想了解是使用了所有线程,还是只使用了一个执行连接操作的线程。有人可以解释我哪里出错并建议是否有任何好的方法可以做到这一点,我也以与​​示例建议相同的方式使用 strand。

提前致谢

【问题讨论】:

  • 对 io_service::run 的调用是否完成?如果 io_service 中有未完成的工作,则不会,除非调用 io_service::stop()。这是设计使然。

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


【解决方案1】:

我想了解是使用了所有线程,还是只使用了一个执行join操作的线程..

前者。 join 函数只会阻塞直到要加入的线程退出执行,但通常所有线程一旦被移交他们可以执行的例程(例如通过构造函数)就会立即开始运行,而不管任何joindetach 来电。

当然,在 asio 的上下文中,只有那些线程可以处理调用例如io_service::run.

【讨论】:

  • 你能解释一下检查所有线程是否正在使用的方法吗?...在​​输出中,当我通过“ctl”终止程序时,一个线程立即执行连接操作,而其他线程执行连接+c",这个场景说明了什么
  • "你能解释一下检查所有线程是否正在使用的方法吗?"如果调用构造函数时线程没有启动,则会引发异常。这是由标准保证的。一旦线程 1 加入,循环将继续执行线程 2 并等待它关闭(如果尚未关闭),依此类推。但是,CTRL+C 宁愿完全终止您的进程。不会再拨打join
猜你喜欢
  • 2014-11-12
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多