WinSock2 sendto() 函数是线程安全的吗?

Is the WinSock2 sendto() function thread-safe?

我目前正在开发一种使用数据报套接字 (UDP) 向客户端发送数据的网络软件。每当我想向客户端发送数据时,我正在调用 sendto() 并传递相应的参数。但是我想知道同时从多个线程对 sendto() 进行阻塞调用是否是个好主意,或者数据是否可能以其他方式交错或损坏。

我已经找到了这个答案:is winsock2 thread safe? 但我不确定这是否适用于 sendto() 就像它适用于 send()

  1. 这是一个系统调用,系统调用是原子的,因此是线程安全的。
  2. 是UDP,UDPsend()/sendto()/sendmsg()发送单个数据报,UDP保证数据报完整性,如果到达的话。

但是恕我直言,两个线程写入同一个套接字可能永远不会在应用程序级别工作,除非在更高级别上格外小心。

系统调用不是原子的,你不能假设它们是线程安全的。 线程安全取决于系统实现。但是线程安全只是意味着你不会遇到崩溃或内存损坏,它不会告诉你任何关于行为的信息。例如,您可能将数据交织在您发送的内容中,而不考虑您的线程调用顺序。

如果您正在 Windows、Winsock2 seems to be thread safe on recent versions of the os 上工作。但再次强调,这并不意味着它会像您期望的那样运行。

与其使用多个线程向套接字发送数据或从套接字接收数据,不如考虑使用 IO ports,它适用于多线程和异步处理。