2017-06-21 3 views
1

スレッドや並列プログラミングでプログラマーがしばしばそう簡単ではないことは知っています。なぜ複数のスレッドサーバのdup(2)ソケットを待ちますか?

スレッディングされたサーバーアプリケーションのリッスンソケットでdup(2)を呼び出すことは、比較的容認されていますが、よく知られていません。私は競争状態を避けるために心の安らぎのために「何も共有しない」スレッドの一般原則を理解しています。

私の質問は、カーネルがすでにaccept(2)の戻り値で相互排他を行っている場合、まさに、リスニングソケットをdup(2)するのはどうして面白いのですか?

本当に改善されている場合は、ソケットをdup(2)-ed:bind(2)またはlisten(2)の後にする必要がありますか?

+0

クイック検索でこのプラクティスの言及が見つかりませんでした。私には無意味に見えます。 'dup'は新しい整数ハンドルを作成し、比較的重要でないビットフラグ(またはただ一つ)を複製します。ファイル/ソケットデータの大部分である*オープンファイル記述*は共有されたままです。 –

+0

私はclose(2)競合状態に関連していると思いますか? – thodg

+0

通常、サーバーはリスニングソケットを閉じませんが、何らかの理由で必要な場合は、恐らくそれを捨てることは妥当かもしれません。 –

答えて

1

はいカーネルは、acceptへの同時呼び出しで1つのプロセス/スレッドのみが処理されることを保証します。正しく使用したい場合は、bindlistenの後に行う必要があります。バインドされたサーバーソケットを共有したいので、bindの後... listenの後に、すべての人のバックログを正しく構成する。

これは設計上の問題です。1つの受け入れスレッドで他のスレッドのプール間で作業をディスパッチしたい場合(自分でプールを管理する必要がある)、スレッドを同時に受け入れてシステムへの負担。最初のものは設定が複雑ですが、バランシングを細かく制御できるようにします。 2番目の方がはるかに簡単ですが、バランシングを制御することはできません。

+0

洞察力がありますが、それでもなぜdup(2)ですか? – thodg

+1

スレッド終了の場合、誰が終了を決定する可能性がありますか?各スレッドに独自の記述子がある場合、コードははるかに簡単ですか? 'dup'を使うことは確かに必須ではありません。 –

関連する問題