Sockets 在套接字编程中,多进程(线程)中是否可以接受相同的侦听套接字?
i、 eSockets 在套接字编程中,多进程(线程)中是否可以接受相同的侦听套接字?,sockets,pthreads,Sockets,Pthreads,i、 e 在父进程中打开侦听套接字 在child1、child2、child3中调用epoll\u wait(侦听套接字) 如果存在连接请求,则在每个子级中调用accept 一般来说,让多个线程在同一个套接字上执行IO而不在它们之间进行某种同步不是一个好主意。在您的场景中,您可能会看到如下内容: 传入的连接请求唤醒所有N个子线程中的epoll_wait 所有N个线程调用接受,1个调用成功,N-1个阻塞(或失败,如果您的侦听套接字是非阻塞的) 更常见的方法是让父线程循环在侦听套接字上调用acc
一般来说,让多个线程在同一个套接字上执行IO而不在它们之间进行某种同步不是一个好主意。在您的场景中,您可能会看到如下内容:
- 传入的连接请求唤醒所有N个子线程中的epoll_wait
- 所有N个线程调用
接受
,1个调用成功,N-1个阻塞(或失败,如果您的侦听套接字是非阻塞的)
更常见的方法是让父线程循环在侦听套接字上调用
accept
,并为每个传入请求启动一个子线程。(或者,如果您担心线程创建开销,您可以有一个空闲时等待条件变量的子线程池;父线程将新接受的套接字添加到队列中,并使用pthread\u cond\u signal
唤醒子线程来处理它。)可以,但您的示例有点不完整:
有关更详细的示例,您可以参考libev、libevent或nginx源代码。更准确地说,您不应该让多个线程同时在一个套接字上执行相同类型的IO。您可以让一个线程从套接字读取数据,而另一个线程正在向同一个套接字写入数据,这是非常安全的。但如果不同步,则不能让两个或多个线程同时读取、同时写入或同时侦听。