pselect() 与循环中的 accept()
pselect() with accept() in a loop
我有一个多线程服务器,它使用这些循环生成新线程:
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() returns 1 如预期。
这样使用 pselect() 有问题吗?我该如何解决?
正如Jeremy Friesner所说,我没有在pselect()超时后重置fd_set。
Linux 程序员手册含糊地说:
On exit, the sets are modified in place to indicate which file descriptors actually changed status.
添加:
FD_ZERO(&readSocket)
FD_SET(socket, &readSocket)
在 pselect() 调用之前解决了它。
我有一个多线程服务器,它使用这些循环生成新线程:
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() returns 1 如预期。
这样使用 pselect() 有问题吗?我该如何解决?
正如Jeremy Friesner所说,我没有在pselect()超时后重置fd_set。
Linux 程序员手册含糊地说:
On exit, the sets are modified in place to indicate which file descriptors actually changed status.
添加:
FD_ZERO(&readSocket)
FD_SET(socket, &readSocket)
在 pselect() 调用之前解决了它。