我可以在线程中接受()吗?

时间:2017-01-10 15:37:45

标签: c multithreading pthreads

我有一个简单的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()

我可以在一个帖子中做同样的事吗?

1 个答案:

答案 0 :(得分:0)

只要您一次只有一个线程在server_socket上运行,您就可以安全地在一个线程中调用该套接字上的accept

您很可能希望一个调用accept的线程获得新连接,以及多个可以处理连接的工作线程。处理此问题的最佳方法是在启动时创建多个工作线程,并为每个线程创建一个连接队列,每个队列都有一个关联的互斥锁。

接受线程将选择其中一个工作人员来处理新连接。然后,它锁定该工作队列的互斥锁,将连接放在队列中,然后解锁。然后,每个工作人员可以锁定其队列的互斥锁,从队列中检索连接,解锁,然后处理连接。