2017-02-28 7 views
0

これは重複しているとは思わない。私はシグナルハンドラが呼び出されたときに他のスレッドに何が起こるかについて非常に具体的な質問があります。Linux:複数のスレッドでのシグナルの影響

私は、ハードウェアで動作するマルチスレッドプログラムを持っています。 SIGTERM(親プロセスから)を取得すると、シグナルハンドラがハードウェアの状態を所定の状態に設定し、exit(1)するようにします。信号マスクで演奏しなかったので、メインスレッドが信号を処理することを理解しています。しかし、それはマルチプロセッサーシステム(ラズベリーパイ)であり、他のスレッドはすべてメインよりも高い優先順位で実行されています。彼らはおそらく眠っているかもしれないが、彼らはまた、ハードウェアに触れるかもしれない。

信号の到着時に他のスレッドがすべてフリーズすると、シグナルハンドラから直接exit()を呼び出し、他のスレッドは決して再び実行されません。しかし、それらが独立して動くことができるなら、ハンドラで目的の状態を設定した後、終了する前にハードウェアを騒がすかもしれません。そして、私は効果を説明するドキュメントを見つけることができません。 「シグナルハンドラ以外のすべてをフリーズする」がデフォルトでない場合、その動作を取得する方法はありますか?

すべてのハードウェア処理を1つのスレッドに入れて割り込みを処理するようにコードを再設計できますが、不便です。いつでも触れる。私はむしろ再設計しないだろう。

答えて

1

他のスレッドは、シグナル処理スレッドの実行中も引き続き実行されます。私はどんな凍結のメカニズムも知らない。

しかし、ハードウェアを操作するスレッドが複数ある場合は、どういうふうに相互排除の仕組みが必要なようです。実際には:

pthread_mutex_lock(&hardware_lock); 
fiddle_with_hardware(); 
pthread_mutex_unlock(&hardware_lock); 

は、次に、あなただけの、あなたのシグナル処理スレッドがロックを取得する必要があり、ハードウェアの状態をリセットし、ロックを解除せずにexitを呼び出すことができます。 exitコールはすべてのスレッドを終了し、ロックが保持されているため、終了する前に他のスレッドがハードウェアを混乱させることはありません。

すべてのハードウェア状態のディスクリート部​​分をすべて処理する複数のスレッドがある場合、各状態部分に対して個別のロックを作成できます。次に、シグナルハンドリングスレッドで最終的なハードウェア状態を設定してexitを呼び出す前に、ロックのすべてをに取得させてください。通常の操作では、状態の個々の部分にアクセスしようとするスレッドが1つしかないため、追加のロックによって測定可能なパフォーマンスへの影響はありません。

他にもう1つ。私は「信号マスクで遊んでいないので、メインスレッドが信号を処理する」ということは正確ではないと思います。 pthreads(7)から:

POSIX.1によれば、((2)、例えばキルを使用して送信された)プロセス指向信号は、プロセス内の単一の、任意に選択されたスレッドによって処理されなければなりません。あなたはSIGTERMがメインスレッドに向けられることを確実にするためにpthread_sigmaskを使用すべきであることを意味し

+0

シグナルハンドラでロックを取得することはできませんが、シグナルハンドラで使用するミューテックスは安全ではありません。 – nos

+0

@nos良い点。シグナルハンドラにフラグを設定させ、シグナルハンドラからの復帰後に残りの処理を行う方が良いでしょう。 –

+0

それは私が恐れていたものです。私はミューテックスの解決策ができないことを知っていました(私の懸念の1つは、wiringPiがカバーの下でミューテックスを使用することです。ハードウェアアクセスを単一のスレッドにすることはできません)。再設計する。ありがとう。 – user15001

関連する問題