Есть ли проблемы с вызовом функции Close () Boost C ++ ASIO одновременно с async_write () в том же сокете? - PullRequest
1 голос
/ 07 мая 2020

Согласно MSDN do c для closesocket:

«Клиент Winsock никогда не должен запускать closesocket на s одновременно с вызовом другой функции Winsock».

Например, что происходит, если поток завершения ввода-вывода обнаруживает ошибку и закрывает сокет:

client_socket_.lowest_layer().close(ec);

, в то время как одновременно другой поток собирается вызвать:

async_write(client_socket_,...)

Могут ли оба этих вызова ударил их базовые API-интерфейсы closesocket () и WSASend (), что вызвало потенциальную ошибку sh?

Я видел эти типы сбоев в обычном C ++, но не был уверен, есть ли у Boost C ++ какие-то встроенного механизма для предотвращения этого? Если нет, то для этих вызовов требуется заблокированный мьютекс с ограниченной областью действия et c., ..

Спасибо.

1 Ответ

1 голос
/ 07 мая 2020

Если вы используете прядь¹ нет реальной проблемы, хотя я утверждаю, что, вероятно, будет чище (намного чище) вызывать shutdown() перед / вместо close() во многих сценариях ios.

Asio требует вас для синхронизации доступа к объектам сокета / потока (на самом деле все, кроме документированных потоковобезопасных объектов, таких как io_context и strand). Нити выполняют роль, традиционно выполняемую критическими секциями.

¹ явным или неявным, см. Зачем мне нужна нить на соединение при использовании boost :: asio?

...