[英]Any issues calling Boost C++ ASIO function close() concurrently with an async_write() on the same socket?
根据 closesocket 的 MSDN 文档:
“Winsock 客户端绝不能与另一个 Winsock function 调用同时在 s 上发出 closesocket。”
例如,如果 IO 完成线程检测到错误并关闭套接字会发生什么:
client_socket_.lowest_layer().close(ec);
同时另一个线程即将调用:
async_write(client_socket_,...)
这两个调用是否都会命中其底层的 closesocket() 和 WSASend() API,从而导致潜在的崩溃?
我在普通的 C++ 中看到过这些类型的崩溃,但不确定 Boost C++ 是否有某种内置机制来防止它? 如果不是,那么这些调用是否需要范围锁定的互斥锁等,..
谢谢。
如果您使用 strand¹ 并没有真正的问题,尽管我认为在许多情况下调用shutdown()
之前/而不是close()
可能更干净(更干净)。
Asio 确实要求您同步对套接字/流对象的访问(实际上,除了文档中的线程安全对象之外的所有内容,如io_context
和strand
)。 链履行了传统上由关键部分承担的角色。
¹ 隐式或显式,请参阅为什么我在使用 boost::asio 时需要每个连接的链?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.