допустимо ли асинхронно отправлять данные до того, как был вызван обработчик завершения предыдущего? - PullRequest
0 голосов
/ 12 октября 2011

Я отправляю данные асинхронно в сокет TCP.Допустимо ли отправлять следующий фрагмент данных до того, как предыдущий был объявлен отправленным обработчиком завершения?

Как я знаю, он не разрешен, когда отправка выполняется из разных потоков.В моем случае все отправления выполняются из одного потока.

Различные модули моего клиента отправляют данные в один и тот же сокет.Например, module1 отправил некоторые данные и продолжит работу, когда будет вызван соответствующий обработчик завершения.До этого io_service вызывал deadline_timer обработчик module2, который приводит к другому async_write вызову.Стоит ли ожидать здесь каких-либо проблем?

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Допустимо ли отправлять следующий фрагмент данных до того, как предыдущий был сообщили как отправленные обработчиком завершения?

Нет, недопустимо чередовать операции записи. Это очень ясно в документации

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

Акцент добавлен мной.

Как я знаю, это не разрешено, когда отправка осуществляется из разных потоки. В моем случае все отправления выполняются из одного потока.

Ваша проблема не имеет ничего общего с потоками.

0 голосов
/ 12 октября 2011

Да, вы можете сделать это, пока основная память (буфер) не будет изменена, пока не будет вызван обработчик записи. Вызов async_write означает, что вы передаете владение буфером Asio. Когда вызывается обработчик записи, владение буфером возвращается вам.

...