在循环中使用select()和accept()

pselect() with accept() in a loop

本文关键字:accept select 循环      更新时间:2023-10-16

我有一个多线程服务器,它通过这些循环生成新的线程:

 while(handle->m_run) {
    if (handle->m_curThreadCount < handle->m_maxThreads) {
      ready = pselect(socket + 1, &readSocket, NULL, NULL, &timeout, NULL);
      if (ready != 1)
        continue;
      DWORD openedSocket = accept(socket, NULL, NULL);
      handle->m_threads.emplace_back(std::thread(serverThread, openedSocket, handle));
      handle->m_curThreadCount++;
    }
  }

大多数情况下,这可以按预期工作,但偶尔pselect()不会触发。我用tcpdump检查了它,知道数据被发送到服务器,所以我认为它与主循环有关。

同样,如果在发送数据之前使用gdb运行pselect(), pselect()将返回1。

使用pselect()这种方式是否有问题,我应该如何解决这个问题?

正如Jeremy Friesner所说,我没有在pselect()超时后重置fd_set。

Linux程序员手册含糊地说:

在退出时,这些集合将被修改,以指示哪些文件描述符实际更改了状态。

添加:

FD_ZERO(&readSocket)
FD_SET(socket, &readSocket)