これは重複しているとは思わない。私はシグナルハンドラが呼び出されたときに他のスレッドに何が起こるかについて非常に具体的な質問があります。Linux:複数のスレッドでのシグナルの影響
私は、ハードウェアで動作するマルチスレッドプログラムを持っています。 SIGTERM(親プロセスから)を取得すると、シグナルハンドラがハードウェアの状態を所定の状態に設定し、exit(1)するようにします。信号マスクで演奏しなかったので、メインスレッドが信号を処理することを理解しています。しかし、それはマルチプロセッサーシステム(ラズベリーパイ)であり、他のスレッドはすべてメインよりも高い優先順位で実行されています。彼らはおそらく眠っているかもしれないが、彼らはまた、ハードウェアに触れるかもしれない。
信号の到着時に他のスレッドがすべてフリーズすると、シグナルハンドラから直接exit()を呼び出し、他のスレッドは決して再び実行されません。しかし、それらが独立して動くことができるなら、ハンドラで目的の状態を設定した後、終了する前にハードウェアを騒がすかもしれません。そして、私は効果を説明するドキュメントを見つけることができません。 「シグナルハンドラ以外のすべてをフリーズする」がデフォルトでない場合、その動作を取得する方法はありますか?
すべてのハードウェア処理を1つのスレッドに入れて割り込みを処理するようにコードを再設計できますが、不便です。いつでも触れる。私はむしろ再設計しないだろう。
シグナルハンドラでロックを取得することはできませんが、シグナルハンドラで使用するミューテックスは安全ではありません。 – nos
@nos良い点。シグナルハンドラにフラグを設定させ、シグナルハンドラからの復帰後に残りの処理を行う方が良いでしょう。 –
それは私が恐れていたものです。私はミューテックスの解決策ができないことを知っていました(私の懸念の1つは、wiringPiがカバーの下でミューテックスを使用することです。ハードウェアアクセスを単一のスレッドにすることはできません)。再設計する。ありがとう。 – user15001