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

 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)


在pselect()调用解决之前。

10-04 15:05