exception_ptrのC++ 0x機能を使用すると、あるスレッドに例外を格納し、別のスレッドがそのスレッドにアクセスできるようになります。しかし、もう一方のスレッドはrethrow_exception()を呼び出さなければなりません。しかし、場合によっては、実際に他のスレッドを中断し、すぐに例外を発生させる必要があります。 nullでないためにexception_ptrをポーリングすることは解決策ではありません。別のスレッドでC++例外を注入する
Windowsに例外を注入する方法の解決策は、http://www.codeproject.com/KB/exception/ExcInject.aspxにあります。スレッドを一時停止し、命令ポインタレジスタを変更してから再開します。しかし、Linux上で動作させるために私のコードも必要です。どうすればそれを達成できますか?
getcontext()のようなものを使用すると、現在のスレッドのコンテキストが取得されます(WindowsではGetContext()はスレッドパラメータを受け入れます)ので、シグナルハンドラで呼び出す必要があります。しかし、私はgetcontext()/ setcontext()をシグナルハンドラで呼び出さないでください... あるいは、シグナルハンドラで直接rethrow_exception()を呼び出すことができましたが、エフェクト。中断されたスレッドは、中断がコールされたスコープのすべてのデストラクタと同じ方法で解き放たれたスタックを持ちます。
ちょっと懐疑的になることは自由です。これはロシアのルーレットです。「プログラムをランダムにデッドロックする方法は?」デバッガAPI関数です。 –
デッドロックが発生するのはなぜですか? –
@Borislav:潜在的にロックの実行(クリーンアップ)を防ぎ、デッドロックを引き起こします。 Herb SutterはDobbs博士について記事を書いています。あなたは決してスレッドを中断してはいけません。 –