gpt4 book ai didi

multithreading - winsock 2. 同时发送的线程安全。 TCP

转载 作者:可可西里 更新时间:2023-11-01 02:47:48 25 4
gpt4 key购买 nike

是否可以让多个线程在同一个套接字上发送?流会交错还是第一个线程上的套接字阻塞(假设是 tcp)?我发现的大多数意见似乎都警告不要这样做,因为明显担心交错,但我也发现了一些相反的评论。交错恐惧是 winsock1 的遗留问题吗?它们是否适合 winsock2?有没有一种方法可以设置允许缺少本地同步的 winsock2 套接字?

下面两种相反的意见...谁对?

评论 1

“Winsock 2 实现应该是完全线程安全的。在不同线程上同时读取/写入应该成功,或者失败并返回 WSAEINPROGRESS,这取决于创建套接字时重叠标志的设置。无论如何,默认情况下会创建重叠套接字; 所以你不必担心。确保你没有使用 NT SP6,如果你使用 SP6a,你应该没问题!”

source

评论 2

“从 Windows 95 开始,同一个 DLL 不会被多个进程访问。每个进程都有自己的 DLL 可写数据段副本。“所有进程共享”模型是旧的 Win16 模型, 幸运的是,它现在已经死了并被掩埋了 ;-)"

source

期待您的评论!吉姆

~编辑1~澄清交错的意思。线程 1 发送消息“Hello”,线程 2 发送消息“world!”。收件人收到:“Hwoel lorld!”。这假设两条消息都没有在 while 循环中发送。这可能吗?

最佳答案

无论如何,我真的建议不要这样做。由于各种非常正当的原因,发送函数可能发送的数量少于您告诉它的数量,如果另一个线程可能进入并尝试也发送一些东西,那么您只是在弄乱您的数据。

现在,您当然可以从多个线程向套接字写入数据,但是除非您在应用程序级别进行了适当的锁定,否则您将无法再控制线上的内容。

考虑发送一些数据:

WSASend(sock,buf,buflen,&sent,0,0,0:

sent 参数将保存编号。实际发送的字节数 - 类似于 send() 函数的返回值。要发送 buf 中的所有数据,您必须循环执行 WSASend 直到所有数据实际发送完毕。

比方说,如果第一个 WSASend 发送除最后 4 个字节之外的所有字节,则另一个线程可能会发送一些内容,而您循环返回并尝试发送最后 4 个字节。

通过适当的锁定来确保不会发生这种情况,从多个线程发送应该没有问题 - 我无论如何都不会这样做,只是为了在出现问题时进行调试。

关于multithreading - winsock 2. 同时发送的线程安全。 TCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com