根据关闭套接字的 MSDN 文档:
“Winsock 客户端绝不能与另一个 Winsock 函数调用同时在 s 上发出 closesocket。”
例如,如果 IO 完成线程检测到错误并关闭套接字会发生什么:
client_socket_.lowest_layer().close(ec);
同时另一个线程即将调用:
async_write(client_socket_,...)
这两个调用是否都命中了它们底层的 closesocket() 和 WSASend() API,
从而导致潜在的崩溃?
我在普通 C++ 中看到过这些类型的崩溃,但不确定 Boost C++ 是否有某种
防止它的内置机制?如果没有,那么这些调用是否需要作用域锁定的互斥锁等,..
谢谢。
最佳答案
如果您使用链¹,则没有真正的问题,尽管我会提出调用 shutdown()
可能更干净(更干净)。之前/代替 close()
在许多场景中。
Asio 确实要求您同步对套接字/流对象的访问(除了记录在案的线程安全对象如 io_context
和 strand
之外的所有内容,真的)。链履行传统上由关键部分承担的角色。
¹ 隐式或显式,参见 Why do I need strand per connection when using boost::asio?
关于c++ - 在同一个套接字上同时调用 Boost C++ ASIO 函数 close() 和 async_write() 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61645582/