У меня есть многопоточный сервер, который порождает новые потоки с этим циклом:
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 () и как мне это исправить?
Как Джереми Фризнер сказал, что я не сбросил fd_set после истечения времени ожидания pselect ().
Руководство программиста Linux смутно гласит:
При выходе наборы модифицируются на месте, чтобы указать, какие дескрипторы файлов фактически изменили статус.
Добавление:
FD_ZERO(&readSocket)
FD_SET(socket, &readSocket)
прежде чем вызов pselect () решил это.
Других решений пока нет …