我有一个简单的Web服务器,fork()
并在子进程中使用accept()
。
这是伪代码:
void server_child_process(int server_socket){
// ...
while (true){
if ( ( client = accept(server_socket, addr, addrlen) ) == false ){
server_debug("Can not socket_accept()...");
}
//...
}
}
accept()
似乎没有问题,也不需要任何同步。
使用fork()
模型,您可以同时拥有多个accept()
。单个随机子进程始终接受单个连接
(例如,两个孩子不接受任何联系)
此模型通常称为pre-fork,因为理论上在初始fork()
之后没有新的fork()
。
我可以在一个帖子中做同样的事吗?
答案 0 :(得分:0)
只要您一次只有一个线程在server_socket
上运行,您就可以安全地在一个线程中调用该套接字上的accept
。
您很可能希望一个调用accept
的线程获得新连接,以及多个可以处理连接的工作线程。处理此问题的最佳方法是在启动时创建多个工作线程,并为每个线程创建一个连接队列,每个队列都有一个关联的互斥锁。
接受线程将选择其中一个工作人员来处理新连接。然后,它锁定该工作队列的互斥锁,将连接放在队列中,然后解锁。然后,每个工作人员可以锁定其队列的互斥锁,从队列中检索连接,解锁,然后处理连接。