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

时间:2015-09-01 10:25:50

标签: multithreading winsock2

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

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

2 个答案:

答案 0 :(得分:1)

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

如果您正在使用Windows Winsock2 seems to be thread safe on recent versions of the os。但是,再一次,它并不意味着它会像你期望的那样表现。

不应使用多个线程发送到套接字或从套接字接收,而应考虑使用IO ports,这是用于多线程和异步处理。

答案 1 :(得分:-2)

  1. 这是一个系统调用,系统调用是原子的,因此是线程安全的。
  2. 它是UDP,UDP send()/sendto()/sendmsg()发送单个数据报,UDP保证数据报完整性,如果它到达的话。
  3. 但是恕我直言两个线程写入同一个套接字可能永远不会在应用程序级别工作,而不需要在更高级别上非常小心。