考虑以下问题的聊天示例: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。
我不明白为什么会这样?
答案 0 :(得分:1)
io_service::run()
在做什么?
run()函数会阻塞,直到所有工作完成,并且不再有调度程序,或者直到io_service停止。
当您调用异步函数(async_read,async_write,...)时,您需要将处理程序传递给这些函数。在完成异步操作时调用处理程序。在io_service::run()
正在处理异步操作。
在调用io_service::run
之前,至少有一个异步操作必须等待执行。如果在没有计划异步操作时调用io_service::run
,则此方法立即返回。所以
io_service::run
来处理异步操作io_service::run
工作(只要存在异步操作,此方法就会运行)查看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)。