スレッド内の Select() システムコール?
-
20-08-2019 - |
質問
複数のシリアル ポートからデータを読み取っています。現在、(sa_handler を設定して)カスタム シグナル ハンドラーを使用して、ファイル記述子情報に基づいてスレッドを比較および起動しています。個別のスレッドに独自のシグナル ハンドラーを持たせる方法を探していたところ、select システム コールを使用する必要があることがわかりました。
今、次のような質問があります。
- スレッド (Qt) を使用している場合、シリアル ポートを監視するための select システム コールをどこに配置すればよいですか?
- select システムコールのスレッドは安全ですか?
- GUI の更新など、アプリで多くの処理が行われるため、CPU に負荷がかかりますか?
これらの質問がばかげていると思われる場合でも、気にしないでください。私はシリアル通信にそのようなメカニズムを使用したことがありません。
解決
にselect
定義。私個人的にpoll
お勧めします - それは、より良いインターフェースを持っていると記述子の任意の数ではなく、システム定義の制限を扱うことができます。
あなたは、特定の記述子の状態に基づいて、スレッドを目覚めています。より良い方法は、各スレッドは独自の記述子を持っているし、自分自身を選択し呼び出す持っているだろう。あなたは、参照して、システムの状態を変更しない]を選択し、限り、あなたはスレッドローカル変数を使用すると、それは安全でしょう。しかし、あなたは間違いなくあなたは、スレッドが依存する記述子を閉じないようにしたいでしょう。
タイムアウトで<=> / <=>を使用すると、スレッドは、通常はスリープ状態にされることを意味し、カーネル側まで「待機中」のまま。スレッドが眠っている間に、それは、任意のCPU時間を使用していません。あなたは常にループの中で回転しているように、他の一方で、タイムアウトなし<=>コールのループの中には/あなたに高いCPU使用率を得られます。
この情報がお役に立てば幸いです。
編集:複数のスレッドでと同じの記述を扱う場合にも、<=> / <=>予期しない結果を有することができます。このため、単純な理由は、記述子が読書のための準備ができているので、最初のスレッドがウェイクアップされるかもしれないということですが、2番目のスレッドが待たなければならない次の「読み取ることができる」ウェイクアップます。
限り、あなたは<=>あなたは問題があるべきではありません複数のスレッドで同じディスクリプタにINGのいないよう。
他のヒント
これは、システムコールである - それは、スレッドセーフである必要があり、私は思います。
。私は前にこれをしませんでしたが、私はそれであればどこではない、むしろ驚くだろう。どのようにCPUに負荷をかけselect()
することは、あなたを待っているファイルハンドルの数に大きく私の意見に依存しています。 <=>は主に(> 1)ファイルの準備になるためにハンドル番号を待つために、使用されます。
また<=>が扱うファイルをポーリングするために使用すべきではないことに言及すべきです。通常の使用法は次のとおりです。あなたはあなたの仕事が行われており、次の事が起こっているまで、ある程度の時間が経過することができます。今、あなたは選択を使用してプロセスを中断し、別のプロセスの実行をしてみましょう。 <=>通常はアクティブなプロセスを中断しません。これはどのようにスレッドと連携し、私はわかりません!私はプロセス全体(すべてのスレッド)が停止していることを、と思うだろう。しかし、これは、文書化される可能性があります。また、あなたはシステム・スレッドまたはユーザー・スレッドを使用するかどうか(Linux上)依存性があります。カーネルは、ユーザーのスレッドを知っているので、全体のプロセスを中断しません。