私は、比較的大ざっぱな、または危険なプラットフォーム固有の作業を行うサードパーティのライブラリにさまざまなタスクを委託しているライブラリに取り組んでいます。(具体的には、LLVM や libjit などの JIT コンパイラを呼び出してマシン コードを構築する数学関数パーサーを作成しています。) 実際には、これらのサードパーティ製ライブラリはクラッシュする傾向があります (一部は私のせいです)。 、もちろん、しかし私はまだいくつかの保険が欲しい)。
次に、私のコードの残りの部分 (または私のライブラリ関数を呼び出すユーザーのコード) をダウンさせることなく、恐ろしく死んでいくジョブ (SIGSEGV、SIGILL など) を非常に優雅に処理できるようにしたいと考えています。明確にするために、その特定のジョブが続行できるかどうかは気にしません (クラッシュ状態を修復しようとするつもりはありません)。また、そのようなクラッシュの後のオブジェクトの状態についてもあまり気にしません (破棄します)。クラッシュが発生した場合はすぐにそれらを削除します)。クラッシュが発生したことを検出し、クラッシュがプロセス全体を停止するのを止め、クラッシュしているものの呼び出しを停止し、実行を再開できるようにしたいだけです。
(もう少し詳しく説明すると、現在のコードは for ループであり、利用可能な JIT コンパイラをそれぞれテストしています。これらのコンパイラの一部はクラッシュする可能性があります。クラッシュした場合は、continue;別のコンパイラを実行してテストを続けたいと思います。 )
現在、signal()かなりひどく失敗するベースの実装があります。もちろん、シグナル ハンドラのアウトは未定義の動作longjmp()であり、シグナル ハンドラはexit()orで終わることがほとんど期待されていterminate()ます。コードを別のスレッドに投げ込むだけでは、少なくとも私がこれまでにテストした方法では役に立ちません。また、C++ 例外を使用してこれを機能させる方法をハックすることもできません。
では、特定の一連の命令/スレッド/ジョブをクラッシュから隔離する最善の方法は何でしょうか?