我正在linux上编写一个服务,它在while循环中使用boost::asio::io_service和io_service::poll。这是一个繁忙的等待循环,例如它会浪费 CPU 周期。
void Application::run()
{
try
{
std::cout << "TcpServer starting..\n";
_TcpServer.reset( new TcpServer(_io_service, boost::ref(_spState)) );
// _io_service.run();
while( ! _spState->QuitSignalled() )
{
_io_service.poll();
}
std::cerr << "quit signalled, TcpServer stopping.. :/" << std::endl;
}
catch(std::exception & e)
{
std::cout << e.what() << "\n";
}
}
我使用 poll 而不是 run 来检查服务中的另一个线程是否已发出服务关闭的信号。
有没有办法在繁忙的等待循环中不使用 poll 来实现这一点?
该服务在单个线程上使用异步 io,其他线程进行数据处理。
我在循环的迭代之间添加了一个睡眠,这似乎减少了 CPU 时间的浪费,但我希望可能有更有效的方法?
void Application::run()
{
using boost::this_thread::sleep_for;
static const boost::chrono::milliseconds napMsecs( 50 );
try
{
std::cout << "TcpServer starting..\n";
_TcpServer.reset( new TcpServer(_io_service, boost::ref(_spState)) );
// _io_service.run();
while( ! _spState->QuitSignalled() )
{
_io_service.poll();
boost::this_thread::sleep_for( napMsecs );
}
std::cerr << "quit signalled, TcpServer stopping.. :/" << std::endl;
}
catch(std::exception & e)
{
std::cout << e.what() << "\n";
}
}