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

问题描述 投票:0回答:1

根据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等等,......。

谢谢。

c++ boost-asio
1个回答
1
投票

如果你使用strand¹,就没有真正的问题,尽管我提出,可能更干净(更干净)地调用 shutdown() 之前 close() 在很多场景下。

Asio确实需要 来同步访问socket流对象(除了文档中的线程安全对象之外的所有其他对象,如 io_contextstrand,真的)。) 股完成了传统上由关键部分担任的角色。

¹ 隐性或显性,见 为什么在使用 boost::asio 时,我需要每个连接的 strand?

© www.soinside.com 2019 - 2024. All rights reserved.