Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 为什么Boost ip::udp::socket不是线程安全的?_Sockets_Boost_Udp_Datagram - Fatal编程技术网

Sockets 为什么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问题 最后,请注意,如果 实际上,除了文件描述符和 您只使用安全的底层系统调用 您使用

根据boost文档,ip::udp::socket对于共享对象不是线程安全的


但是,如果我们查看用于套接字编程的底层UNIX API,SOCK_DGRAM套接字上的recv()是线程安全的。我们之所以知道这一点,是因为这里记录了一个不安全操作的列表,而没有recv()。

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

POSIXAPI中的文件描述符也是如此。这是一个常见的滑稽错误源,比如关闭/重用文件描述符上的ABA问题

最后,请注意,如果

  • 实际上,除了文件描述符和
  • 您只使用安全的底层系统调用
  • 您使用的所有成员在逻辑上都是常量(没有任何变化)
实际上,在不进行同步的情况下使用这些IO对象是非常安全的。只是文档不能保证这一点


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

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