Sockets 为什么Boost ip::udp::socket不是线程安全的?
根据boost文档,ip::udp::socket对于共享对象不是线程安全的Sockets 为什么Boost ip::udp::socket不是线程安全的?,sockets,boost,udp,datagram,Sockets,Boost,Udp,Datagram,根据boost文档,ip::udp::socket对于共享对象不是线程安全的 但是,如果我们查看用于套接字编程的底层UNIX API,SOCK_DGRAM套接字上的recv()是线程安全的。我们之所以知道这一点,是因为这里记录了一个不安全操作的列表,而没有recv()。这是因为从不同线程访问对象将构成数据竞争 POSIXAPI中的文件描述符也是如此。这是一个常见的滑稽错误源,比如关闭/重用文件描述符上的ABA问题 最后,请注意,如果 实际上,除了文件描述符和 您只使用安全的底层系统调用 您使用
但是,如果我们查看用于套接字编程的底层UNIX API,SOCK_DGRAM套接字上的recv()是线程安全的。我们之所以知道这一点,是因为这里记录了一个不安全操作的列表,而没有recv()。这是因为从不同线程访问对象将构成数据竞争 POSIXAPI中的文件描述符也是如此。这是一个常见的滑稽错误源,比如关闭/重用文件描述符上的ABA问题 最后,请注意,如果
- 实际上,除了文件描述符和
- 您只使用安全的底层系统调用
- 您使用的所有成员在逻辑上都是常量(没有任何变化)
这是一个良好的实践/良好的库设计:您有一个接口合同,其中记录了保证。其余是实现细节。随着时间的推移,实现细节可能会发生变化,您无法重新检查每次更新是否仍然存在额外的“假定保证”。事实上,特定平台上的
ip::udp::socket
可能使用的一些API是线程安全的,这并不意味着整个类是线程安全的。