【发布时间】:2012-07-14 08:45:18
【问题描述】:
我使用的是 Linux 3.2.0、x86_64。 我可以同时从多个线程调用一个套接字的 accept() 吗?
【问题讨论】:
标签: linux multithreading sockets pthreads posix
我使用的是 Linux 3.2.0、x86_64。 我可以同时从多个线程调用一个套接字的 accept() 吗?
【问题讨论】:
标签: linux multithreading sockets pthreads posix
是的,您可以从多个线程和多个进程在同一个侦听套接字上调用accept(),尽管可能没有您想象的那么重要。内核只允许一个成功。当这通过进程完成时,它被称为预分叉,它为每个新连接节省了fork() 的费用。但是当您处理线程时,您可以更轻松地拥有一个等待新连接队列的现有线程池。一个线程执行accept 并写入队列,工作线程读取队列并执行其操作。它更简洁,是一种易于理解的模式,而且您几乎不会丢失任何东西。
【讨论】:
accept 会序列化对系统调用的访问,但会在它可用时唤醒所有线程/进程,从而产生thundering herd problem,这是一个正确实现的辅助队列解决的问题。不过,我不确定accept 是否还有这个问题。