2014-09-08 3 views
4

Предположим, что при вызове io_service :: run() запланировано несколько операций async_read (между ними могут быть другие операции). Что произойдет, когда асинхронная операция, такая как async_write, запланирована в функции ReadHandler?io_service :: run() порядок обработки функций async_ *

void handler(const boost::system::error_code& error, std::size_t bytes) { 
    async_write(sock, boost::asio::buffer(wbuf), whandler); 
} 

То есть, когда будет вызван async_write? я бы ожидать, что порядок исполнения быть:

1) async_read //1 
2) async_write 
3) async_read //2 
4) async_write 

Гарантирует ли это порядок исполнения?

ответ

3

Нет, это не гарантировано. Например, если первый обработчик вызывается и хочет писать, что делать, если второй буфер еще не доступен для чтения? Конечно, запись должна быть первой. Но что, если запись невозможна к тому времени, когда второй буфер готов к чтению? Тогда, конечно, второе чтение должно произойти до первой записи.

1

Вы злоупотребляете интерфейс boost::asio.

В одном гнезде может быть не более одной операции чтения.

Цитата из boost::asio::async_readdocs:

Эта операция осуществляется через ноль или более вызовов функции async_read_some в ручья, и известен как в составе операции. Программа должна убедиться, что поток не выполняет никаких других операций чтения (таких как async_read, функция async_read_some потока или любые другие скомпонованные операции, которые выполняют чтение) до эта операция завершается.

+0

Я не использую несколько async_reads, пример был просто быстро составлен. Одним из async_reads может быть другая операция async. Я вижу, могу ли я его отредактировать. –

+0

@MariusHerzog Было бы хорошо видеть, что вы на самом деле имеете в виду. – inf

+0

Я думаю, что я действительно имею в виду: при вызове run() запланировано несколько расписаний async_reads (между ними могут быть другие операции). Когда ReadHandler вызывает async_write, являются ли async_writes немедленно обработаны после завершения ReadHandler? –

Смежные вопросы