为什么 Boost ip::udp::socket 不是线程安全的?
Why is Boost ip::udp::socket not thread safe?
根据 boost 文档 - https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/reference/ip__udp/socket.html,ip::udp::socket 对于共享对象不是线程安全的。
但是,如果我们查看用于套接字编程的底层 UNIX API,SOCK_DGRAM 套接字上的 recv() 是线程安全的。我们知道这一点是因为此处记录了不安全操作列表 - https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09 并且 recv() 不存在。
因为从不同线程访问对象会造成数据竞争。
The same would be true for your file-descriptor in the posix API. This is a common source for ludicrous bugs like ABA problem on closed/reused file descriptors.
最后,请注意,如果 class
- 实际上不存储文件描述符和
之外的任何其他状态
- 您只使用安全的底层系统调用,
- 您使用的所有成员在逻辑上都是常量(不改变任何东西)
可能在没有同步的情况下使用这些 IO 对象实际上是安全的。只是 文档不能保证。
这很好 practice/good 库设计:您有一个接口契约,其中记录了保证。剩下的就是实现细节。实施细节可能会随着时间的推移而改变,您无法负担重新检查每次更新是否仍然有效的额外“假定保证”。
根据 boost 文档 - https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/reference/ip__udp/socket.html,ip::udp::socket 对于共享对象不是线程安全的。
但是,如果我们查看用于套接字编程的底层 UNIX API,SOCK_DGRAM 套接字上的 recv() 是线程安全的。我们知道这一点是因为此处记录了不安全操作列表 - https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09 并且 recv() 不存在。
因为从不同线程访问对象会造成数据竞争。
The same would be true for your file-descriptor in the posix API. This is a common source for ludicrous bugs like ABA problem on closed/reused file descriptors.
最后,请注意,如果 class
- 实际上不存储文件描述符和 之外的任何其他状态
- 您只使用安全的底层系统调用,
- 您使用的所有成员在逻辑上都是常量(不改变任何东西)
可能在没有同步的情况下使用这些 IO 对象实际上是安全的。只是 文档不能保证。
这很好 practice/good 库设计:您有一个接口契约,其中记录了保证。剩下的就是实现细节。实施细节可能会随着时间的推移而改变,您无法负担重新检查每次更新是否仍然有效的额外“假定保证”。