これらのループで新しいスレッドを生成するマルチスレッド サーバーがあります。
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() を使用すると何か問題がありますか?どうすれば修正できますか?