从多个线程调用accept()

Str*_*101 7 linux concurrency multithreading tcp

我正在编写一个并发TCP服务器,它必须使用'每个连接的线程'方法处理多个连接(使用线程池).我怀疑哪个是每个线程获得不同文件描述符的最佳方式.

我发现接下来的两种方法是最推荐的:

  1. 主线程认为accepts()所有的传入连接和存储他们的描述符上的数据结构(例如:一queue).然后每个线程都能从队列中获取fd.
  2. 从每个线程直接调用 Accept().(Unix网络编程V1推荐)

我找到他们每个人的问题:

  1. 存储所有fd的静态数据结构必须在线程可以读取之前被锁定(mutex_lock),因此在相当多的线程想要在同一时刻读取的情况下,我不知道会经过多长时间直到所有人都能实现目标.
  2. 我一直在读,与同时调用相关的Thundering Herd问题accept()还没有在Linux上完全解决,所以也许我需要为它创建一个人工解决方案,最终使应用程序至少与方法一样慢1.

资料来源:

(一些链接在讨论方法2:在Linux上存在一个雷鸣般的问题 - 存在问题 - 以及我发现的一篇文章(过时):linux-scalability/reports/accept.html

并且建议方法1的SO答案:可以同时调用接受一个插槽从几个线程同时


我真的对此事感兴趣,所以我会很感激任何意见:)

Joh*_*nck 5

正如您链接的StackOverflow答案中所提到的,调用accept()的单个线程可能就是这样.您提到了有关锁定的问题,但是现在您将在Boost.Lockfree,Intel TBB和其他地方找到可用的锁队列实现.如果您愿意,可以使用其中一个,但是您可能只使用条件变量让工作线程休眠并在建立新连接时唤醒其中一个线程.