TCP-сокеты boost.asio. Будут ли упорядочиваться асинхронные операции?

StackOverflow https://stackoverflow.com/questions/1854115

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

(обсуждение с точки зрения async_write, также относится к async_read)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top