繁体   English   中英

在同一个套接字上同时调用 Boost C++ ASIO function close() 和 async_write() 是否有任何问题?

[英]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_contextstrand )。 链履行了传统上由关键部分承担的角色。

¹ 隐式或显式,请参阅为什么我在使用 boost::asio 时需要每个连接的链?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM