【问题标题】:Is the WinSock2 sendto() function thread-safe?WinSock2 sendto() 函数是线程安全的吗?
【发布时间】:2015-09-01 21:04:38
【问题描述】:

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

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

【问题讨论】:

    标签: multithreading winsock2


    【解决方案1】:

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

    如果您在 Windows 上工作,Winsock2 seems to be thread safe on recent versions of the os。但再一次强调,这并不意味着它会按照您的预期行事。

    您应该考虑使用IO ports,而不是使用多个线程向套接字发送数据或从套接字接收数据。

    【讨论】:

    • 感谢您对 IO 完成端口的提示!我应该能够使用它们构建一个可行的解决方案。
    【解决方案2】:
    1. 这是一个系统调用,系统调用是原子的,因此是线程安全的。
    2. 是UDP,UDPsend()/sendto()/sendmsg()发送单个数据报,UDP保证数据报的完整性,如果它到达的话。

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

    【讨论】:

    • "系统调用是原子的" 通常不是,甚至不是线程安全的。系统必须保证没有程序可以破坏任何其他程序。
    • 正如@usr 已经说过的,系统调用不一定是原子的!我建议你修复你的答案。这似乎是一个糟糕的答案,请修复它。
    • @usr 系统调用在我 49 年来使用过的每个操作系统上都是原子的。如果您有例外,请出示它。特别是如果您可以生成一个可以交错 UDP 数据报的系统,请这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2021-12-16
    相关资源
    最近更新 更多