1

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 マルチスレッド セーフなクラッシュ リカバリ ハンドラを作成するにはどうすればよいでしょうか。

4

2 に答える 2

1

ReactOSにはPSEHと呼ばれる SEH クローンがあります。 ROS Newsletter #49で簡単に言及されており、 /include/crt/excpt.h/include/reactos/lib/pseh/pseh2.hなどでどのように実装されているかを確認できます。マクロと (現在は x86 のみ) アセンブリでハックしますが、機能します。

そうは言っても、UNIX ではシグナル + スレッドの相互作用は醜いことで有名なので、SEH を使用する目的がシグナルを処理することである場合は、別の解決策を見つけることをお勧めします。

于 2009-03-24T16:41:00.710 に答える
0

setjmp/を使用して同様の例外処理を使用しlongjmp、スレッド ローカル ストレージを使用しています。新しいスレッドごとに、そのスレッドの malloc のローカル jmpbuf という初期化関数を呼び出します。

注意!マルチスレッド環境で適切にテストしたことはありません!

于 2009-03-24T07:59:48.917 に答える