Похоже, этот вопрос сводится к следующему:
, что происходит, когда
blockquote>async_write_some()
вызывается одновременно в одном сокете из двух разных потоковЯ считаю, что это точно операция, которая не является потокобезопасной. Порядок, в котором эти буферы выходят на провод, не определен, и они могут быть чередующимися. Особенно, если вы используете функцию удобства
async_write()
, так как она реализована как серия вызововasync_write_some()
внизу, пока не будет отправлен весь буфер. В этом случае каждый фрагмент, который отправляется из двух потоков, может чередоваться случайным образом.Единственный способ защитить вас от удара этого случая - это построить вашу программу, чтобы избежать подобных ситуаций.
Один из способов сделать это - написать буфер отправки прикладного уровня, который один поток отвечает за нажатие на сокет. Таким образом, вы можете защитить только буфер отправки. Имейте в виду, что простой
std::vector
не будет работать, так как добавление байтов в конец может привести к перераспределению его, возможно, пока есть выдающийсяasync_write_some()
, ссылающийся на него. Вместо этого, вероятно, неплохо использовать связанный список буферов и использовать функцию разброса / сбора asio.