一、Run() 无任务时会自动退出
io_service 对象,在asio对象构造时,作为参数传入;当asio scoket对象没有执行任何操作和事件之前,就条用
io_service的run函数,会造成,io对象直接退出;
确保run不会自动退出的方法有,
1.先操作asio socket连接操作;
2.使用work 对象,对象构造使用io_service作为参数传入,在work对象析构之前io的run() 始终保持阻塞状态,不会自动退出;//我没看过boost::asio::io_service::work对象的源码实现,猜测是在构造函数中调用了事件或执行了接口,并在析构函数中执行了取消事件或接口;
二、部分代码示例
io_service * io = new io_service;
sock = boost::make_shared<ip::tcp::socket>(*io);
boost::asio::io_service::work work(*io);
if (_iothr && !_iothr->joinable())
{
std::cout << _iothr->get_id() << std::endl;
std::cout << "iothr 已退出" << std::endl;
}
//构造work对象后,可以将run()在这里调用;
//_iothr = boost::make_shared<boost::thread>(&CTcpConnectClient::run, this, io);
//没有构造work对象,socket 异步连接接口 在run()之前调用;
sock->async_connect(*m_ep, boost::bind(&CTcpConnectClient::conn_handler, this, boost::asio::placeholders::error, sock));
_iothr = boost::make_shared<boost::thread>(&CTcpConnectClient::run, this, io);