我正在编写一个并发 TCP 服务器,它必须使用“每个连接一个线程”方法(使用“线程池”)处理多个连接。我的疑问是哪个是每个线程获取不同文件描述符的最佳方式。 我发现下面两种方法是最推荐的:
一个主线程
,accepts()
queue
)。然后每个线程都可以从队列中获取 fd。
Accept() 从每个线程直接调用。 (
锁定
(mutex_lock
accept()
调用相关的 (一些讨论方法 2 的链接:does-the-thundering-herd-problem-exist-on-linux-anymore - 以及我发现的一篇关于它的文章(已过时):
linux-scalability/reports/accept.html还有一个推荐方法 1 的答案:can-i-call-accept-for-one-socket-from-several-threads-simultaneously
正如您链接的
StackOverflow 答案accept()
的单个线程可能是可行的方法。您提到了对锁定的担忧,但现在您会发现无锁队列实现可在 Boost.Lockfree、
Intel TBB和其他地方使用。如果您愿意,可以使用其中之一,但您可能只使用条件变量来让工作线程休眠并在建立新连接时唤醒其中之一。