избегая напряженного ожидания с boost :: asio poll

Я пишу сервис на Linux, который использует boost :: asio :: io_service с io_service :: poll в цикле while. Это занятый цикл ожидания, например это тратит впустую циклы процессора.

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";
}
}

Я использую опрос вместо запуска, чтобы проверить, сигнализировал ли другой поток в сервисе о закрытии службы.

Есть ли способ добиться этого без использования опроса в занятом цикле ожидания?

Служба использует асинхронный ввод в одном потоке, а другие потоки выполняют обработку данных.

Я добавил сон между итерациями цикла, который, похоже, сокращает время процессора, но я надеялся, что может быть более эффективный способ?

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";
}
}

1

Решение

Я бы сказал, просто воспользоваться тем, что boost::asio::io_service по умолчанию является полностью потокобезопасным, и делать

iosvc.run();

И сигнализируйте об отключении службы на «другом потоке в службе», как если бы вы:

iosvc.stop();

Запомни iosvc.reset() прежде чем позвонить {run,poll}[_one] опять же, согласно документации.

Конечно, вы также можете использовать другие средства, чтобы сигнализировать фактическим логическим работникам об окончании, но тогда это совершенно независимо от Boost Asio.

2

Другие решения