【问题标题】:What happens when writing to a socket from different threads at the same time?从不同线程同时写入套接字时会发生什么?
【发布时间】:2011-05-06 19:08:05
【问题描述】:

我有两个线程,每个线程都有一个包含一些数据的缓冲区。我有一个写入 TCP 套接字的函数。 (我使用 ffmpeg。)数据包将如何到达服务器 - 以某种疯狂的混合方式,或以其他顺序,或者操作系统(Windows,在我的情况下)是否会让一个线程等待,直到另一个线程完成了吗?

【问题讨论】:

  • 您的套接字实现是什么,您使用什么 API 进行写入?
  • 撒旦本人将从最近的空网络门户中出来。
  • @Noah:那么当两条不同的线索让撒旦本人同时从最近的空网络门户出现时会发生什么?如果线程在 CPU 的不同核心上运行,两个网络门户之间的距离完全等距,从而一个更接近一个核心而另一个更接近另一个核心,该怎么办?好奇的人想知道。
  • 我猜这会导致恶魔从撒旦的鼻子里出来。不过,出于显而易见的原因,还没有尝试过。

标签: c++ windows multithreading tcp ffmpeg


【解决方案1】:

这完全取决于您使用的是哪种“套接字”实现。如果您的实现是同步的,您将获得第一个线程的数据,然后是第二个线程的数据(第二个线程将在第一个发送时阻塞)。如果你的实现不同步,你会得到乱码。

【讨论】:

  • @Kabumbus - 那么为什么 q 标记为 C++?你写的怎么样?
  • 我相信没有“不同步”的套接字实现这样的东西。至少当您谈论 TCP 套接字时。考虑到“写入”到套接字是一项复杂的操作。除其他外,它还修改了 TCP 控制块状态机。
  • 我的意思是——套接字上的每个操作都是原子的。当然,如果线程通过多次调用send(或类似方法)写入数据 - 可能会有沙拉。
  • @valdo:当且仅当您的实现同步时,每个操作都是原子的。如果实现不同步,你会得到垃圾。
  • @Billy ONeal:我的观点是:如果您的流套接字实现不同步 - 您可能会得到更糟糕的后果,甚至可能导致系统崩溃。因此 - 我相信没有这样的事情。
【解决方案2】:

嗯,嗯,你必须同步它们,以避免意外结果。

【讨论】:

  • 这是完整的推测,没有更多有关代码的信息
  • 不,我是这么说的,因为 Kabumbus 没有显示任何代码,而且我们不知道他使用的是哪种实现方式。所以,对我来说,没有足够的信息来做一些代码。
  • 嗯,这有点不公平 - 这当然是相当典型的行为。
  • @Eamon - 如果使用的套接字函数是线程安全的,那么添加自己的同步就有点过头了。这个答案做出了明确的声明,即“您必须自己进行锁定”。至少另一个说“这取决于”。
  • 如果没有足够的信息让您回答帖子,请对问题发表评论。回答您不理解或没有足够信息的问题将导致答案没有相关性。
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多