С Boost.Asio документы:
Класс io_service :: strand предоставляет возможность отправлять и отправлять
обработчики с гарантией того, что ни один из этих обработчиков не будет выполнен
одновременно.
Существует хороший пример из strand
использования в Boost.Asio примерах.
strand
гарантирует, что выполнение вашего обработчика будет синхронизировано. Это означает, что strand
полезен, если ваш io_service
выполняется из нескольких потоков. Это не связано с тем, как вы планируете свои задачи (обработчики).
strand
не может помочь вам одновременно выполнять несколько операций чтения или записи через сокет, поскольку внутреннее выполнение чтения / записи не может выполняться одновременно, поэтому должна быть только одна активная операция чтения или записи в асинхронном режиме.
Для reads
вы просто вызываете async_read
, чтобы инициировать последовательность чтения, и снова вызываете ее из обработчика чтения после использования полученных данных. То же самое, что вы делаете в однопоточной среде.
Для writes
, если есть одновременные производители (если несколько потоков предоставляют данные для записи в сокет), вам нужна параллельная очередь (например, усиление циклического буфера , ищите «Пример ограниченного буфера») , Ваша функция записи берет данные из этого буфера и async записывает их в сокет. Ваш обработчик записи вызывает вашу функцию записи.