c++ - 在同一个套接字上同时调用 Boost C++ ASIO 函数 close() 和 async_write() 有什么问题吗?

标签 c++ boost-asio

根据关闭套接字的 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_contextstrand 之外的所有内容,真的)。链履行传统上由关键部分承担的角色。

¹ 隐式或显式,参见 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/

相关文章:

c++ - 同一函数的 const 和非 const 版本 - 反模式?

c++ - boost::asio::ip::tcp::acceptor 上的段错误

c++ - 当线程安全容器上有大量计算和推送/弹出时,来自 boost asio 的同步或异步更好吗?

c++ - BOOST ASIO multi-io_service RPC框架设计RFC

c++ - async_read 不读取从 telnet 发送的数据

c++ - 当我定义一个具有该类的(非引用)返回类型的函数时,该类的哪个——默认构造函数或复制构造函数——被调用?

c++ - GCC 与 Clang 中的 Stack Smashing(可能是由于金丝雀)

c++ boost asio异步编译错误

android - 仅在eclipse中打开hello-jni.c文件时在eclipse中编译Hello-Jni失败

c++ - 仅使用基础知识将十进制转换为二进制