さて、この質問はスレッド管理に関するものではありません...そうですね。この構成に対するさまざまなソリューションを探しています。いくつかのアイデアがありますが、問題を解決できる解決策を探しています。そして、長所と短所を比較検討して、最適なものを実装します。
これが状況です。
スレッドを生成するマネージャー アプリケーションがあります。このスレッドは継続的に実行され、USB 経由でシステムに接続されたボードとのシリアル通信を処理します。マネージャー アプリケーションは、システム上で実行されている他のアプリケーションとこのスレッドとの間の通信を容易にします。スレッドは、次の 2 つのことを実際に実行する必要があります。
- 可変タイマーでシリアル経由でボードにサンプル データをポーリングします。通常は 1 分に 1 回程度です (シリアル バスはかなり遅く、ボーは 4800 です。これを制御することはできません)。
- マネージャー アプリケーションとの通信を容易にします。(つまり、他のアプリケーションがサンプル データを要求すると、マネージャはその要求をスレッドに転送します。スレッドは操作を実行し、データを返します)
私の最初のデザインはシンプルなもので、うまくいきました。マネージャーからスレッドへの通信にキューとミューテックスを使用します。したがって、スレッドのロジックは次のとおりです。
- 初期化
- 管理者からシャットダウンコマンドを受け取っていない間
- タイマーが切れたら、ボードをポーリングしてデータを取得します
- それ以外の場合は、マネージャーによってキューに投稿されたメッセージがあるかどうかを確認してください。あれば処理する
問題は、CPU 使用率を考慮していないことです。99.9% の時間、私のスレッドは何も処理しておらず、電力を消費しています。やるべきことがあるまで、このスレッドをスリープ状態にする方法を実装する必要があります。だからいくつかのアイデア:
select() を使用してブロックします。これは、使用する必要があるタイマーに基づいてブロックでき、キュー メッセージングの実装をソケット メッセージングに変更できます。代わりに、スレッドはマネージャに対してクライアント ソケットを開き、マネージャはソケットを介してメッセージをスレッドに渡します。次に、select() は、fd でアクティビティが発生するか、タイマーが作動するまでスリープします。
長所: まさに必要な機能です。
短所: ソケットは、既にメモリを共有しているスレッドと通信するための処理が少し重くありませんか?
信号システムを使用してください。(Linux の知識が豊富な人なら、ここで実装例を示してくれるかもしれません。正確な方法はわかりません。) しかし、スレッドはタイマーの間スリープし、シグナルが発生した場合に処理するためにウェイクアップすることができます。マネージャーから受け取った。
メリット: 共有メモリを使用して現在の実装を維持
短所:実装方法がわからない。fds の代わりにシグナルで動作する select() のような関数はありますか?
ミューテックスの可能性があります。マネージャーがミューテックスに投稿するまでブロックできました。
長所: 引き続きメモリを共有する
短所:タイマー処理をマネージャーに移動する必要があるかもしれませんが、他のタイマーと実行する重要な作業があるため、実際にはオプションではありません。
お勧めし、気軽に批評してください。私は効率的なオプションを受け入れます。ただし、これは組み込みシステムで実行されているため、リソースの使用が重要であることに注意してください。