首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步写入套接字线程是否安全?

异步写入套接字线程是否安全?
EN

Stack Overflow用户
提问于 2012-04-14 02:47:18
回答 2查看 5.3K关注 0票数 12

考虑Socket.BeginSend()方法。如果两个线程池线程同时调用此方法,它们各自的消息是否会相互混合,或者套接字类会阻止这种情况发生吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-14 02:58:54

我找到了一个笑脸post on the MSDN forum,它似乎回答了你的问题。

  1. 您可以同时对多个BeginSends进行排队。您不需要锁定

编辑:

更多有趣的信息:

如果您在Remark section of the MSDN doc BeginSend()中向下滚动一点,您会发现可能与您相关的回调方法的有趣用法。

...如果希望在调用BeginSend方法后阻止原始线程,请使用WaitHandle.WaitOne方法。...

票数 7
EN

Stack Overflow用户

发布于 2012-04-21 07:28:59

.NET套接字实例不是线程安全的,因为同时调用某些方法(相同或不同的方法)可能会导致状态不一致。但是,就自身的而言,BeginSend() BeginReceive() 和方法是线程安全的。

对每个(或两者)都有多个未完成呼叫是安全的。

BeginReceive()的情况下,当调用的顺序中有数据可用时,它们将得到服务。例如,如果您的处理很长,但您希望其他接收尽可能快地发生,则这会很有用。当然,在这种情况下,您的代码可能会同时处理多个回执,您可能需要自己的同步逻辑来保护您的应用程序状态。

对于BeginSend(),每个调用都会尝试将发送的数据推入套接字缓冲区,一旦被套接字缓冲区接受,您的回调就会被调用(您将在其中调用EndSend())。如果没有足够的缓冲区空间用于任何调用,它将阻塞。

注意:不要假设默认的8k缓冲区意味着“我可以用8k的数据快速调用BeginSend(),然后它就会阻塞”,因为以下情况是正确的:

  1. 8K是一个“标称大小”的数字,缓冲区可能会缩小并在一定程度上增大
  2. 当您排队等待8K的调用时,将在网络上发送数据以减少排队的8K data

一般而言:

  • 如果您在线程内多次调用BeginSend(),则可以确保发送将按调用顺序离开计算机。
  • 如果您从多个线程调用BeginSend(),则无法保证顺序,除非您使用其他阻塞机制强制实际调用按特定顺序发生。但是,每个调用都会在一个连续的网络字节流中正确地发送数据。
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10146588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档