2016-03-11 3 views
3

Мой предпочтительный способ использования io_service - создать поток при запуске приложения, который выполняет метод запуска io_service. Проблема в том, что если нет задачи для io_service, ее метод запуска немедленно возвращается, и поток завершается.Keep io_service alive

Как вы можете видеть из chat_client.cpp

... 
boost::asio::io_service io_service; 
... 
chat_client c(io_service, iterator); 
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 

нить запускается после некоторые асинхронной задачи добавляется io_service. Это делается в конструкторе chat_clients.

Мой вопрос: есть ли способ создать поток до некоторая задача добавлена ​​к io_service, i. е.

// create io_service and thread on application start 
boost::asio::io_service io_service; 
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 
// add some task to io_service 
chat_client c(io_service, iterator); 

ответ

6

Как вы сказали, его метод запуска немедленно возвращается, потому что у него нет работы. Вам необходимо использовать boost :: asio :: io_service :: work. Подумайте об этом как о манекене, так что io_service :: run никогда не заканчивается, и поэтому не возвращается сразу.

Пример:

auto work = boost::make_shared<boost::asio::io_service::work>(m_ioservice); 
    m_ioservice.run(); 

Некоторые люди предпочитают io_service :: бежать всегда блокировать, ожидая работы. Другие люди предпочитают поведение Asio по умолчанию.

+2

Кроме того, чтобы остановить приложение, я использую 'work.reset();' before 't.join();' – Vertex