0

これらのループで新しいスレッドを生成するマルチスレッド サーバーがあります。

 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() を使用すると何か問題がありますか?どうすれば修正できますか?

4

1 に答える 1

1

Jeremy Friesnerが言ったように、pselect() がタイムアウトした後で fd_set をリセットしませんでした。

Linux Programmer's manual には、漠然と次のように記載されています。

終了時に、どのファイル記述子が実際にステータスを変更したかを示すために、セットが適切に変更されます。

追加:

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

pselect() 呼び出しが解決する前に。

于 2015-10-09T06:14:18.723 に答える