TCP / сокеты boost.asio, будут ли заказываться асинхронные операции? - PullRequest
2 голосов
/ 06 декабря 2009

Если я вызываю boost :: asio :: async_write / async_read непосредственно друг за другом, будут ли упорядочены данные? Или мне нужно подождать обратного вызова, прежде чем я снова позвоню «запись / чтение»?

Заранее спасибо!

1 Ответ

2 голосов
/ 06 декабря 2009

Данные не гарантированно упорядочены, и если вы используете эти функции, вам следует дождаться обратного вызова, прежде чем писать снова.

(обсуждение в терминах async_write , также относится к async_read )

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

Вы также должны учитывать темы. Если вы вызываете async_x в потоке несколько раз, вы можете получить параллельные операции с одним и тем же базовым потоком в разных потоках, что приведет к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...