【问题标题】:Why is Boost ip::udp::socket not thread safe?为什么 Boost ip::udp::socket 不是线程安全的?
【发布时间】:2021-03-25 05:44:01
【问题描述】:

根据 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() 不存在。

【问题讨论】:

  • ip::udp::socket 在特定平台上可能使用的一些 API 是线程安全的这一事实并不意味着该类作为一个整体是线程安全的。

标签: sockets boost udp datagram


【解决方案1】:

这是因为从不同的线程访问对象会构成数据竞争。

posix API 中的文件描述符也是如此。这是可笑错误的常见来源,例如关闭/重用文件描述符上的 ABA 问题。

最后,注意如果类

  • 实际上不存储文件描述符以外的任何其他状态
  • 您只使用安全的底层系统调用,
  • 您使用的所有成员在逻辑上都是 const(不会改变任何内容)

可能在不同步的情况下使用这些 IO 对象实际上是安全的。只是文档并不能保证

这是一种良好的做法/良好的库设计:您有一个接口契约,其中记录了保证。剩下的就是实现细节。实施细节可能会随着时间的推移而变化,您无法重新检查每次更新是否仍然存在额外的“假定保证”。

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2012-11-20
    • 2013-10-11
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多