C OSX Carbonマルチスレッドアプリケーション用の「クラッシュ ハンドラ」をインストールしようとしています。Windows では、Windows のシンプルで効率的な__try{} __except{} SEH を簡単に使用できます。(これらは C++ の例外とは無関係であることに注意してください。これらは低レベルの C 構造体です!)
これは、私が以前に SO で尋ねた質問と非常に関連しています。また、以前の SO の質問にも関連しています。
答えは、コードの各領域の前に setjmp() を使用し、クラッシュが発生した場合はシグナル ハンドラを使用して longjmp() に戻すことです。
しかし、これの実装は自明ではありません.. マルチスレッドのためです! Windows の __try{} __except{} イディオムはスレッドセーフであり、Just Works です。しかし明らかに setjmp はスレッドセーフではありません。
では、実装はどのようになるでしょうか。スレッドローカルストレージを実装する必要があると考え続けています。最初に setjmp を初期化し、環境状態をスレッド ローカル バッファーに格納します。その後、シグナル ハンドラーは、スレッド ローカル領域を調べて、環境データを再度見つける必要があります。ただし、Google も SO も、これが適切な戦略であるという証拠を示していません。特に、setjmp() はスレッドセーフでないと文書化されているためです。そして、スレッドローカルストレージは、すべてのスレッドがそれ自体を登録し、(その環境データを保持するために) メモリを割り当て、スレッドの破棄時にそれを解放する必要はありませんか?
OSX でこれらすべてをラップするマクロを作成できることを願っています。私の __try __except コードは問題なく機能します。
では、シグナルと setjmp を使用して OSX マルチスレッド セーフなクラッシュ リカバリ ハンドラを作成するにはどうすればよいでしょうか。