2009-06-26 10 views
5

複数のシリアルポートからデータを読み取っています。現在私は、ファイル記述子情報に基づいてスレッドを比較して起動させるカスタムシグナルハンドラ(sa_handlerを設定)を使用しています。私は、独自のシグナルハンドラを持つ個々のスレッドを持つ方法を探していました。この点に関して、selectシステムコールが使用されることがわかりました。スレッド内のSelect()システムコール?

今、私は次のような質問している:

  1. 私はシリアルポートを監視するためにselectシステムコールを入れないところ私は、スレッド(Qtの)を使用していますか?
  2. selectシステムコールスレッドは安全ですか?
  3. GUIの更新など、アプリで多くのことが起こっているため、CPUを集中的に使用していますか?

これらの質問がばかげている場合は、気にしないでください。私はこのようなメカニズムをシリアル通信に使用したことはありません。

答えて

7

POSIX specification (select)は、selectの定義を探す場所です。私は個人的にはpollを推奨しています。より良いインターフェースを持ち、システム定義の制限ではなく、任意の数の記述子を扱うことができます。

私が正しく理解していれば、特定の記述子の状態に基づいてスレッドを起動しています。より良い方法は、各スレッドに独自の記述子があり、select自体を呼び出すことです。あなたはselectがシステム状態を変更しないことを見ています。スレッドローカル変数を使用する限り、安全です。しかし、確実にスレッドが依存する記述子を閉じないようにする必要があります。

select/pollタイムアウトを使用すると、スレッドが通常はスリープ状態になることを意味するカーネル側に「待機」が残されます。スレッドがスリープしている間は、CPU時間を使用していません。逆にタイムアウトのないselectコールのwhile/forループを使用すると、ループ内で常に回転しているため、より高いCPU使用率を得ることができます。

これが役に立ちます。

EDIT:複数のスレッドで同じ記述で作業する場合も、select/pollは、予期しない結果を持つことができます。これの単純な理由は、ディスクリプタの読み込み準備が整っているために最初のスレッドが起動する可能性がありますが、2番目のスレッドはの次のを "読み込み可能"ウェイクアップまで待たなければなりません。

複数のスレッドで同じディスクリプタにselectが書かれていない限り、問題はありません。

+0

ガード情報! 1つの質問スレッドは、ソケットfdが読み取り/書き込み操作を行う準備ができている場合に、起動する必要があることをどのように知っていますか?カーネルはスレッドにいくつかの干渉を与えますか? –

+0

@SumitTrehanカーネルは、スレッドを実行可能状態にするとき、つまりスレッドがCPU時間を取得するとすぐに実行されるので、スレッドを起動します。 – Medicine

0

システムコールです。スレッドセーフである必要があります。

私は以前これをしていませんでしたが、もしそうでなければ、私はむしろ驚くでしょう。どのようにCPUを集中的にselect()は、あなたが待っているファイルハンドルの数に大きく依存しています。 select()は、ほとんどの場合、ファイルハンドルの数が待機状態になるのを待つために使用されます。

パフォーマンスの理由から、select()をファイルハンドルのポーリングに使用しないでください。通常の使用方法は次のとおりです。作業は完了してから次の作業が完了するまで時間がかかります。これで、selectを使用してプロセスを中断し、別のプロセスを実行させます。 select()は通常、アクティブなプロセスを中断します。どのようにスレッドと一緒にこの作品、私はわからない!私は、プロセス全体(とすべてのスレッド)が中断されていると思います。しかし、これは文書化されているかもしれません。また、システムスレッドとユーザースレッドのどちらを使用するかによって(Linux上で)依存する可能性があります。カーネルはユーザスレッドを知らないので、プロセス全体を一時停止します。

+0

これは本当に良い答えではありません。多くの推測作業...とにかく "ユーザスレッド"とは何ですか? –

関連する問題