C++ 了解多线程如何与Boost io_服务一起工作

C++ 了解多线程如何与Boost io_服务一起工作,c++,multithreading,boost,boost-asio,C++,Multithreading,Boost,Boost Asio,我正在学习多线程和Boost库(特别是Asio),我很难理解下面的代码是如何工作的(从Boost.org教程中稍作修改) 我从这段代码中所期望的是线程t将负责运行io_服务,这意味着在此期间可能会发生其他操作 相反,代码的行为与往常一样,aka,io.run“阻塞”代码流,直到打印机对象内的计时器停止启动async_wait,因此只有在计时器不再工作后才会打印“hey there” 但这还不是全部:据我所知,io_服务在调用run()方法后不会停止运行,只要有与它们相关联的工作(无论是工作对象还

我正在学习多线程和Boost库(特别是Asio),我很难理解下面的代码是如何工作的(从Boost.org教程中稍作修改)

我从这段代码中所期望的是线程t将负责运行io_服务,这意味着在此期间可能会发生其他操作

相反,代码的行为与往常一样,aka,io.run“阻塞”代码流,直到打印机对象内的计时器停止启动async_wait,因此只有在计时器不再工作后才会打印“hey there”

但这还不是全部:据我所知,io_服务在调用run()方法后不会停止运行,只要有与它们相关联的工作(无论是工作对象还是计时器)。话虽如此,由于线程与io_服务相关联,我想知道为什么io_服务首先会停止运行:毕竟,线程与io_服务“链接”并继续自己运行;这显然与一个事实有关,那就是我一开始显然不明白这个线程在做什么

当我将“saysomething”方法添加到pot中时,事情变得更加复杂:我希望能够在两个计时器继续工作的同时写一些东西并打印字符串。我使用的代码如下:

int main()
{
  boost::asio::io_service io;
  printer p(io);
  boost::thread t(&saysomething);
  io.run();
  std::cout << "Hey there\n";
  t.join();

  return 0;
}
intmain()
{
boost::asio::io_服务io;
打印机p(io);
boost::线程t(&saysomething);
io.run();
标准::cout
  • 为什么不立即打印“Hey there”字符串,而不是等待io_服务停止运行
main
的线程在打印之前也会阻塞
io\u服务
,因此在服务停止之前不会打印“Hey there”

  • 如果一个线程链接到io_服务,那么它到底是如何停止运行的,这应该相当于io_服务有工作要做
线程不是保持
io_服务
活动的原因,计时器任务才是。
io_服务
实际上是保持线程活动的原因。服务的工作正在等待计时器,因此直到计时器过期,服务还有工作要做

  • 既然线程不允许“代码流”向前移动,并且将该线程链接到我的方法而不是io_服务不会导致任何错误,那么该线程最初的目的是什么
从线程调用
run
的目的是将调用线程捐赠给
io_服务
。在
run
退出之前,该服务拥有该线程,该线程是该服务线程池的一部分。当该线程在该服务的池中时,您向该服务发布的任何任务都可能会交给该线程。添加第二个线程,第二个线程根本没有与服务交互,因为它没有调用
run
。因此,它不是服务线程池的一部分

Timer 1: 0
Timer 2: 1
Timer 1: 2
Timer 2: 3
Timer 1: 4
Timer 2: 5
Timer 1: 6
Timer 2: 7
Timer 1: 8
Timer 2: 9
Hey there
Final count is 10
int main()
{
  boost::asio::io_service io;
  printer p(io);
  boost::thread t(&saysomething);
  io.run();
  std::cout << "Hey there\n";
  t.join();

  return 0;
}
Timer 1: 0
Timer 2: 1
Timer 1: 2
Timer 2: 3
Timer 1: 4
Timer 2: 5
Timer 1: 6
Timer 2: 7
ghg       //<--- my input
You said ghg
Timer 1: 8
Timer 2: 9
Hey there
Final count is 10