Sockets 在套接字编程中,多进程(线程)中是否可以接受相同的侦听套接字?

Sockets 在套接字编程中,多进程(线程)中是否可以接受相同的侦听套接字?,sockets,pthreads,Sockets,Pthreads,i、 e 在父进程中打开侦听套接字 在child1、child2、child3中调用epoll\u wait(侦听套接字) 如果存在连接请求,则在每个子级中调用accept 一般来说,让多个线程在同一个套接字上执行IO而不在它们之间进行某种同步不是一个好主意。在您的场景中,您可能会看到如下内容: 传入的连接请求唤醒所有N个子线程中的epoll_wait 所有N个线程调用接受,1个调用成功,N-1个阻塞(或失败,如果您的侦听套接字是非阻塞的) 更常见的方法是让父线程循环在侦听套接字上调用acc

i、 e

  • 在父进程中打开侦听套接字
  • 在child1、child2、child3中调用epoll\u wait(侦听套接字)
  • 如果存在连接请求,则在每个子级中调用accept

  • 一般来说,让多个线程在同一个套接字上执行IO而不在它们之间进行某种同步不是一个好主意。在您的场景中,您可能会看到如下内容:

    • 传入的连接请求唤醒所有N个子线程中的epoll_wait
    • 所有N个线程调用
      接受
      ,1个调用成功,N-1个阻塞(或失败,如果您的侦听套接字是非阻塞的)

    更常见的方法是让父线程循环在侦听套接字上调用
    accept
    ,并为每个传入请求启动一个子线程。(或者,如果您担心线程创建开销,您可以有一个空闲时等待条件变量的子线程池;父线程将新接受的套接字添加到队列中,并使用
    pthread\u cond\u signal
    唤醒子线程来处理它。)

    可以,但您的示例有点不完整:

  • 创建监听插座
  • 使用epoll\u Create创建epoll集
  • 使用epoll\u ctl将侦听\u套接字注册到epoll集合
  • 在child1、child2、child3中调用epoll\u wait(epoll set
  • 如果存在连接请求,则在每个子级中调用accept
  • epoll_wait确保只有一个线程获得连接事件,并且只有该线程将调用accept

    如果创建两个epoll集并将侦听套接字注册到这两个集,则会收到两次事件,每个epoll集一次,不建议这样做

    您可以参考本教程,并在本论坛中搜索一些有关epoll的有趣讨论,以了解更多信息


    有关更详细的示例,您可以参考libev、libevent或nginx源代码。

    更准确地说,您不应该让多个线程同时在一个套接字上执行相同类型的IO。您可以让一个线程从套接字读取数据,而另一个线程正在向同一个套接字写入数据,这是非常安全的。但如果不同步,则不能让两个或多个线程同时读取、同时写入或同时侦听。