Linux 我可以同时从多个线程为一个套接字调用accept()吗?

Linux 我可以同时从多个线程为一个套接字调用accept()吗?,linux,multithreading,sockets,pthreads,posix,Linux,Multithreading,Sockets,Pthreads,Posix,我使用的是Linux 3.2.0,x86_64。 我可以从多个线程同时为一个套接字调用accept()吗?是的,您可以从多个线程和多个进程在同一侦听套接字上调用accept(),尽管它可能没有您想象的那么重要。内核只允许一个成功。当对进程执行此操作时,称为预分叉,它为每个新连接节省了fork()的开销。但是当您处理线程时,您可以更容易地拥有一个现有的线程池,它等待一个新连接队列。一个线程执行接受并写入队列,工作线程读取队列并执行其操作。它更干净,是一种很好理解的模式,几乎不会丢失任何东西。来自o

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

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

来自opengroup.org,listen()函数:“backlog参数为实现提供了一个提示,实现应使用该提示来限制套接字侦听队列中未完成的连接数。”已经有一个队列,如果你这么说的话,我们不应该再需要一个了。请记住,出现最佳实践的原因有很多。这些原因是什么?为什么两个队列比一个好?待办事项队列是建议性的&在没有根的情况下,您没有太多的控制权;它通常不是很大,tcp在满时开始拒绝连接。您可以更轻松地控制自己的队列,接受更多的连接,并根据需要使用各种线程和/或多路复用来处理它们。如果您想暂时停止接受连接,那么您有多个线程要尝试控制,而不仅仅是一个线程。如果你想关闭你的线程,你可能不得不在它们阻塞accept而不是干净的时候开始清理它们。这使得负载平衡更加困难。早期版本的
accept
会序列化对系统调用的访问,但会在系统调用可用时唤醒所有线程/进程,从而导致错误,而正确实现的辅助队列会解决这个问题。但是,我不确定
accept
是否仍然存在此问题。可能存在重复的