从多个线程调用accept()

问题描述 投票:0回答:1

我正在编写一个并发 TCP 服务器,它必须使用“每个连接一个线程”方法(使用“线程池”)处理多个连接。我的疑问是哪个是每个线程获取不同文件描述符的最佳方式。 我发现下面两种方法是最推荐的:

一个

主线程

    accepts()
  1. 所有传入连接并存储它们在数据结构上的描述符(例如:a
    queue
    )。然后每个线程都可以从队列中获取 fd。 Accept()
    从每个线程直接调用
    。 (
  2. Unix网络编程V1
  3. 推荐) 我发现他们每个人的问题:

存储所有 fd 的静态数据结构必须先被

锁定

    mutex_lock
  1. ),然后线程才能从中读取数据,因此,如果有相当多的线程想要在完全相同的时刻读入,我不知道不知道要花多少时间才能让他们所有人都实现目标。
    我一直在读到,与同时 accept() 调用相关的 
  2. Thundering Herd
  3. 问题在 Linux 上尚未完全解决,所以也许我需要为其创建一个 人工解决方案,最终使该应用程序至少与方法 1 一样慢。
    
    
    
    
    
  4. 来源:

(一些讨论方法 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 答案
linux multithreading concurrency tcp
1个回答
6
投票
accept()

的单个线程可能是可行的方法。您提到了对锁定的担忧,但现在您会发现无锁队列实现可在 Boost.Lockfree

Intel TBB
和其他地方使用。如果您愿意,可以使用其中之一,但您可能只使用条件变量来让工作线程休眠并在建立新连接时唤醒其中之一。
© www.soinside.com 2019 - 2024. All rights reserved.