【发布时间】:2015-09-01 21:04:38
【问题描述】:
我目前正在开发一种使用数据报套接字 (UDP) 向客户端发送数据的网络软件。每当我想向客户端发送数据时,我当前都会调用 sendto() 并传递相应的参数。但是我想知道同时从多个线程对 sendto() 进行阻塞调用是否是个好主意,或者数据是否可能以其他方式交错或损坏。
我已经找到了这个答案:is winsock2 thread safe?,但我不确定这是否适用于 sendto() 和 send()
【问题讨论】:
我目前正在开发一种使用数据报套接字 (UDP) 向客户端发送数据的网络软件。每当我想向客户端发送数据时,我当前都会调用 sendto() 并传递相应的参数。但是我想知道同时从多个线程对 sendto() 进行阻塞调用是否是个好主意,或者数据是否可能以其他方式交错或损坏。
我已经找到了这个答案:is winsock2 thread safe?,但我不确定这是否适用于 sendto() 和 send()
【问题讨论】:
系统调用不是原子的,你不能假设它们是线程安全的。 线程安全取决于系统实现。但是线程安全只是意味着您不会遇到崩溃或内存损坏,它不会告诉您有关行为的任何信息。例如,您可能在发送的内容中交错了数据,与线程调用顺序无关。
如果您在 Windows 上工作,Winsock2 seems to be thread safe on recent versions of the os。但再一次强调,这并不意味着它会按照您的预期行事。
您应该考虑使用IO ports,而不是使用多个线程向套接字发送数据或从套接字接收数据。
【讨论】:
send()/sendto()/sendmsg()发送单个数据报,UDP保证数据报的完整性,如果它到达的话。但是恕我直言,写入同一个套接字的两个线程可能永远不会在应用程序级别工作,除非在更高级别上格外小心。
【讨论】: