【问题标题】:Can I call accept() for one socket from several threads simultaneously?我可以同时从多个线程为一个套接字调用 accept() 吗?
【发布时间】:2012-07-14 08:45:18
【问题描述】:

我使用的是 Linux 3.2.0、x86_64。 我可以同时从多个线程调用一个套接字的 accept() 吗?

【问题讨论】:

标签: linux multithreading sockets pthreads posix


【解决方案1】:

是的,您可以从多个线程和多个进程在同一个侦听套接字上调用accept(),尽管可能没有您想象的那么重要。内核只允许一个成功。当这通过进程完成时,它被称为预分叉,它为每个新连接节省了fork() 的费用。但是当您处理线程时,您可以更轻松地拥有一个等待新连接队列的现有线程池。一个线程执行accept 并写入队列,工作线程读取队列并执行其操作。它更简洁,是一种易于理解的模式,而且您几乎不会丢失任何东西。

【讨论】:

  • 来自 opengroup.org,listen() 函数:“backlog 参数为实现提供了一个提示,实现应使用该提示来限制套接字侦听队列中未完成连接的数量。”已经有一个队列了,我们不应该再需要一个了。
  • 如果你这么说。请记住,出现最佳实践是有原因的。
  • 这些原因是什么?为什么两个队列比一个队列好?
  • 积压队列是建议性的,如果没有 root 用户,您没有太多控制权;它通常不是很大,并且 tcp 已满时开始拒绝连接。您可以更轻松地控制自己的队列并接受更多连接并根据需要使用各种线程和/或多路复用处理它们。如果你想暂时停止接受连接,你有多个线程来尝试控制,而不仅仅是一个。如果你想关闭你的线程,你可能不得不在它们阻塞接受而不是干净时开始将它们吹灭。它使负载平衡更加困难。离开头顶。
  • 早期版本的accept 会序列化对系统调用的访问,但会在它可用时唤醒所有线程/进程,从而产生thundering herd problem,这是一个正确实现的辅助队列解决的问题。不过,我不确定accept 是否还有这个问题。
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2015-04-27
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多