创建用于运行io_service的线程

时间:2018-01-10 06:37:28

标签: boost boost-asio

考虑以下问题的聊天示例:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/examples.html

查看客户端文件:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/chat/chat_client.cpp

在这里,似乎运行io_service的boost线程很重要..

chat_client c(io_service, iterator);

boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

如果我在创建chat_client对象之前创建线程,那么如果在下面的while循环中打印,则io_service.stopped()将返回true。

我不明白为什么会这样?

1 个答案:

答案 0 :(得分:1)

io_service::run()在做什么?

  

run()函数会阻塞,直到所有工作完成,并且不再有调度程序,或者直到io_service停止。

当您调用异步函数(async_read,async_write,...)时,您需要将处理程序传递给这些函数。在完成异步操作时调用处理程序。在io_service::run()正在处理异步操作。

在调用io_service::run之前,至少有一个异步操作必须等待执行。如果在没有计划异步操作时调用io_service::run,则此方法立即返回。所以

  1. 首先调用异步操作
  2. 在线程中调用io_service::run来处理异步操作
  3. 当第一个异步操作结束时,你必须计划另一个异步操作来执行,以便io_service::run工作(只要存在异步操作,此方法就会运行)
  4. 查看chat_client

    的构造函数
        socket_.async_connect(endpoint,
        boost::bind(&chat_client::handle_connect, this,
          boost::asio::placeholders::error, ++endpoint_iterator));
    

    async_connect方法被调用 - 这是第一个要执行的异步操作。

    io_service::stopped()结束工作时,

    io_service::run返回true,因为没有要处理的异步操作。

      

    run()函数的正常退出意味着io_service对象已停止(stopped()函数返回true)。