3

私が取り組んでいるアプリケーションには、いくつかのセカンダリスレッドが必要であり、それぞれが多数のファイルハンドル(少なくとも1、10以上)を担当します。selectファイルハンドルはスレッド間で共有されないため、読み取り/書き込みの準備ができているかどうかを確認するときに、一方のセカンダリスレッドがもう一方のスレッドをブロックすることを心配する必要はありません。私が確認したいのは、select/pselect呼び出しの実行中に、どちらのセカンダリスレッドもメインスレッドの実行を停止させないということです。

これは問題ではないと思います。たとえば、Webサーバーでそのようなことが行われると思いますが、Googleで検索したところ、「はい、これはできます」と具体的に言っているものは見つかりませんでした。これは問題を引き起こさないという私の仮定で正しいですか?

明確にするために、私が持っているものは次のようになります:

  • 実行のメインスレッド(select()着信コマンドメッセージと発信応答を処理するループ)

  • 二次スレッド#1(select()サービスを提供するループ)

  • 二次スレッド#2(select()別のサービスを提供するループ)

前に述べたように、ファイルハンドルはスレッド間で共有されません。個々のスレッド内で作成、使用、破棄され、他のスレッドはその存在を認識しません。

4

2 に答える 2

9

いいえ、メインスレッドをブロックすることを心配する必要はありません。私はさまざまなプロジェクトで複数のスレッドでselectを使用しました。それらが別個のFDSETを持っている限り、あなたは大丈夫であり、それぞれが独立したイベントループのように使用することができます。

于 2010-12-21T22:07:25.033 に答える
0

selectはプロセス全体をブロックすることになっているのではありませんか?ソケットにノンブロッキングモードを設定しようとしましたか?

また、ヘルプについては、select_tutのマンページを参照してください。

select_tutマンページの関連セクションは次のとおりです。

So what is the point of select()? Can't I just read and write to my descriptors whenever I want? The point of select() is that it watches multiple descriptors at the same time and properly puts the process to sleep if there is no activity.

于 2010-12-21T22:06:25.907 に答える