1

SIGSEGVでプロセスID、スレッドID、バックトレースなどの情報を収集し、この情報をファイル/パイプ/ソケットに書き込むハンドラーを実装しようとしています。

問題は、1つのスレッドがSIGSEGVを経験した場合、他のスレッドがすぐに続く可能性がある(おそらくかなり高い)可能性があることにあります。2つのスレッドがたまたまレポートを書き出すコードに到達した場合、それらは(同じファイルへの)書き込みをインターリーブします。

私は、ここsignal(7) で少なくとも2つのケースを見て、他の人がこの問題を回避するために使用したトップアンサーにリンクされたビデオも見たように、非同期信号セーフ機能のみを使用する必要があることを知っています。pthread_spin_trylock

これは上記の問題を防ぐための安全な方法ですか?

4

1 に答える 1

1

ほとんどのシステムpthread_spin_trylockでは、アトミックコンペアアンドスワップ(少なくともx86では割り込みセーフなCAS命令(他の人と話すことはできません))を使用して実装されます。

私はおそらくCASを自分で使用して、それが発生することを確認します。これがそのgccドキュメントです:http: //gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

そしてサンプルコード:

 static int lock = 0; // global scope

シグナルハンドラー内:

 if (__sync_bool_compare_and_swap(&lock, 0, 1)) {
     // Got the lock
 } else
     pthread_exit(); // terminate this thread
于 2012-09-27T18:48:36.000 に答える