【问题标题】:Can I accept() inside a thread [duplicate]我可以在线程内接受()吗?
【发布时间】:2017-05-25 03:55:25
【问题描述】:

我有一个简单的网络服务器 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() 生成。

我可以在一个线程中做同样的事情吗?

【问题讨论】:

  • 是的,确实可以。

标签: c multithreading pthreads


【解决方案1】:

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

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

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

【讨论】:

  • “只要您一次只有一个线程在 server_socket 上运行,您就可以安全地在线程中调用该套接字上的接受”——这就是我的观点。使用 fork() 你可以有多个来自不同子节点的并行 accept()。始终接受来自单个孩子的单个连接。并且没有两个孩子接受相同的连接。我现在要编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2015-12-02
  • 2013-01-03
相关资源
最近更新 更多