在socket编程中,多进程(线程)中accept()同一个监听socket可以吗?

jon*_*jon 2 sockets pthreads

IE

  1. 在父进程中打开监听套接字
  2. 在child1,child2,child3...中调用epoll_wait(listening_socket)
  3. 如果有连接请求,请在每个子进程中调用accept

Dav*_*har 5

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

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

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