セカンダリスレッドでselect()/pselect()を呼び出すと、プライマリスレッドがブロックされますか?
-
12-10-2019 - |
質問
私が取り組んでいるアプリケーションがあり、それぞれいくつかのセカンダリスレッドが必要であり、それぞれが多くのファイルハンドル(少なくとも1、10以上)を担当します。ファイルハンドルはスレッド間で共有されていないため、1つのセカンダリスレッドが他のスレッドをブロックすることを心配する必要はありません select
読み取り/書き込みの準備ができているものを確認する。私が確信したいのは、どちらのセカンダリスレッドもメインスレッドが実行を停止するのではないということです。 select
/pselect
呼び出しが実行されています。
これは問題ではないと想像します。たとえば、そのようなことがWebサーバーで行われると想像するでしょうが、グーグルで「はい、これができる」と具体的に言ったものは見つかりませんでした。これは問題を引き起こさないという私の仮定で正しいですか?
明確化のために、私が持っているものは次のように見えます。
実行のメインスレッド(
select()
受信コマンドメッセージと発信応答のループ処理)セカンダリスレッド#1(
select()
サービスを提供するループ)セカンダリスレッド#2(
select()
別のサービスを提供するループ)
前述したように、ファイルハンドルはスレッド間で共有されていません - 個々のスレッド内で作成、使用、破壊され、他のスレッドは存在について無知です。
解決
いいえ、メインスレッドをブロックすることを心配する必要はありません。さまざまなプロジェクトで複数のスレッドでSelectを使用しました。それらが異なるfdsetsを持っている限り、あなたは大丈夫で、それぞれが独立したイベントループのように使用できます。
他のヒント
選択はプロセス全体をブロックすることになっていませんか?ソケットにノンブロッキングモードを設定しようとしましたか?
また、いくつかのヘルプについては、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.