「接続ごとのスレッド」アプローチ(スレッドプールを使用)で複数の接続を処理する必要がある同時TCPサーバーを作成しています。私の疑問は、すべてのスレッドが異なるファイル記述子を取得するための最も最適な方法はどれかということです。
次の 2 つの方法が最も推奨されることがわかりました。
- すべての着信接続を処理し、それらの記述子をデータ構造 (例: a ) に格納するメイン スレッド。次に、すべてのスレッドがキューから fd を取得できます。
accepts()
queue
- Accept() はすべてのスレッドから直接呼び出されます。( Unix Network Programming V1で推奨)
それぞれに私が見つけた問題:
- すべての fd を格納する静的データ構造は、スレッドが読み取る前にロック( ) する必要があるため、かなりの数のスレッドがまったく同じ瞬間に読み取りたい場合、どのくらいの時間が経過するかわかりません。全員が目標を達成するまで。
mutex_lock
- 同時呼び出しに関連するThundering Herd
accept()
の問題は、Linux ではまだ完全に解決されていないことを読んでいたので、アプリケーションを少なくともアプローチと同じくらい遅くする人工的な解決策を作成する必要があるかもしれません。 1.
ソース:
(アプローチ2について話しているいくつかのリンク:dos-the-thundering-herd-problem-exist-on-linux- anymore-およびそれについて見つけた1つの記事(古い):linux-scalability/reports/accept.html
そして、アプローチ1を推奨するSOの回答:can-i-call-accept-for-one-socket-from-several-threads-simultaneously
私はこの問題に非常に興味があるので、それについての意見をお待ちしております:)