根据MSDN文档中关于closesocket的说明。
"一个Winsock客户端绝对不能在s上与另一个Winsock函数调用同时发出closeocket"
例如,如果一个IO完成线程检测到一个错误并关闭socket,会发生什么情况?
client_socket_.lowest_layer().close(ec);
同时另一个线程要调用的时候,会发生什么?
async_write(client_socket_,...)
这两个调用会不会同时碰到底层的closesocket()和WSASend()API,从而导致潜在的崩溃?
我在普通的C++中见过这种类型的崩溃,但不知道Boost C++是否有某种内置的机制来防止这种情况?如果没有,那么这些调用是否需要一个作用域锁定的mutex等等,......。
谢谢。
如果你使用strand¹,就没有真正的问题,尽管我提出,可能更干净(更干净)地调用 shutdown()
之前 close()
在很多场景下。
Asio确实需要 你 来同步访问socket流对象(除了文档中的线程安全对象之外的所有其他对象,如 io_context
和 strand
,真的)。) 股完成了传统上由关键部分担任的角色。
¹ 隐性或显性,见 为什么在使用 boost::asio 时,我需要每个连接的 strand?