2012-06-18 3 views
0

Это мой код сервера:подталкивания async_read_some точно не асинхронный

socket_.async_read_some(boost::asio::buffer(data_read.data(), Message::header_length), 
    boost::bind(&TcpConnection::handle_read_header, shared_from_this(), 
    boost::asio::placeholders::error)); 

Если я пишу на следующий код в цикле

boost::thread::sleep(boost::posix_time::seconds(2)); 

в функции «handle_read_header», которая вызывается выше «async_read_some» весь поток ждет до конца сна. Поэтому, когда приходит другой запрос, он не обрабатывается до тех пор, пока сон не закончится. Не предполагается ли асинхронно обрабатывать каждый запрос? Я новичок в повышении и C++. Пожалуйста, дайте мне знать, если я упомянул что-то не так.

+0

На самом деле, даже если «sleep» Boost :: asio будет продолжать читать асинхронно. Просто, если обработчик работает, и вы используете только один поток, Asio не имеет возможности уведомить вас о завершении чтения. Как вы ожидаете, что он будет себя вести? – ereOn

+0

@ereOn Вы говорите, что методы, которые я вызываю внутри 'handle_read_header', должны быть в другом потоке? и ereOn не async_read_some создает новый поток для каждого обработчика? – Navin

+0

@ereOn, если я вызову поток внутри обработчика к тому времени, когда поток закончит сокет, возможно, изменился новым запросом. – Navin

ответ

3

Прочитать, что запланировано с помощью async_read_some, осуществляется в потоке, который называется io_service::run(). Если у вас есть только одна нить , она будет ждать завершения одного обработчика чтения, прежде чем запускать другой номер.

Вы можете создать пул потоков, запустив больше потоков с помощью io_service::run() или сделайте выполнение обработчика чтения короче.

+0

спасибо за быстрый ответ, я попробовал 'io_service :: run()', но похоже, что он не совсем корректно работает. но да, я пытаюсь сократить выполнение обработчика чтения. – Navin

+0

@Navin, что не работает должным образом? Возможно, вы не синхронизировали доступ к общим переменным? –