次の戦略はうまく機能しているようです。
- 受け入れられた要求をプログラムが処理する方法に関係なく、リスナー ソケットで非ブロッキングの accept() 呼び出しで単一のスレッド/プロセスを使用する。
- 各プロセスでブロックする accept() 呼び出しで複数のスレッド/プロセスを使用する。接続が入ると、accept() が 1 つだけ起動されます。
うまく機能しないのは、コールバックで accept() を使用して各スレッド/プロセスのリスナー ソケットを監視する EPOLLIN です。これにより、すべてのスレッド/プロセスが起動しますが、実際に accept() を実行できるのは 1 つだけです。これは、accept() をブロックして、接続が入ってくると混乱を引き起こした昔のようなものです。
EPOLLIN を使用しているときに、単一のスレッド/プロセスのみを accept() にウェイクアップさせる方法はありますか? それとも、スレッドを使用して分離しただけで、ブロッキングの accept() を使用するように書き直す必要がありますか?
単一のスレッド/プロセスのみがaccept()を実行するオプションではありません。これは、各プロセスがaccept()を実行している唯一のデーモンであるかどうかを各プロセスが知る必要がない方法でプロセスをプールとして管理しようとしているからです。リスナーソケット。