sem_wait
をシグナルハンドラ(特にスレッドごとのSIGSEGVシグナル)で使用できないのはなぜですか?誰かがアプリケーションをクラッシュさせるシナリオの例を教えてもらえますか?私はsem_wait
がリエントラントとの両方であり、スレッドセーフであると思います、ここで何が問題なのですか?なぜそれがない非同期の安全?sem_waitとシグナルハンドラ
答えて
セマフォの値が0のときにアプリケーションが信号を受信し、その信号を受信したスレッドがセマフォの値(sem_post)をインクリメントすると思われる場合はどうなりますか?シグナルハンドラでsem_waitを呼び出すと、プロセスはデッドロックしますか?
もちろん、sem_waitが非同期シグナルセーフな関数のリストにない場合、実装は無料で鼻の悪魔を呼び出すことができます。
非同期セーフは、スレッドセーフではなく厳しい要件です。クリティカルセクションでグローバルデータを保護するために、プリミティブを使用してスレッドセーフなコードを書くことができます。シグナルハンドラはこれに頼ることはできません。たとえば、sem_wait内のクリティカルセクション内に存在することができ、同時にセグメンテーションの原因となるものを実行できます。これにより、sem_waitのスレッドセーフな保護が解除されます。
sem_waitは、このような理由のためにシグナルハンドラ内で使用することはできません。
スレッドAはSEM1にsem_wait呼び出しです。スレッドAが終了すると、スレッドAはsem1にポストします。ただし、終了する前にシグナルを受信してからハンドラに入り、sem1でsem_waitを呼び出します。 Aはsem1にポストするものなので、ハンドラは決して戻ってこないので、デッドロックが発生します。これがシグナルハンドラの中で何かを待つのは良い規則です。問題は、ASFAIKは、クラッシュよりもデッドロックと関連があります。
また、シグナルハンドラの理想的な目的に違反します。これは、外部割り込みを処理して、すぐにやっていたことに戻ることです。
最後に、SIGSEGVを処理するのではなく、SIGSEGVを取り除くのがより良い目標ですか?
- 1. スレッドperlとシグナルハンドラ
- 2. Xcode:GDBとシグナルハンドラ
- 3. Python:Django:シグナルハンドラとメインスレッド
- 4. eventfd_read/write対sem_wait/post
- 5. C++例外とシグナルハンドラ
- 6. pause()シグナルハンドラ
- 7. django:mock post_saveシグナルハンドラ?
- 8. シグナルハンドラ内のaio_read
- 9. C++のMac OS Xのsemaphore.h:とのトラブル `sem_open()`と `sem_wait()`
- 10. sem_wait()/ sem_post()のシグナル安全な使用
- 11. sem_wait()を使用したCセマフォー
- 12. 移植OS-9シグナルハンドラ
- 13. たPerl:シグナルハンドラ:シンボル参照として
- 14. Cメインプロセス用のLinuxシグナルハンドラ
- 15. Cのネストされたシグナルハンドラ
- 16. 未定義g ++でコンパイルするときのsem_waitとpthread_createへの参照
- 17. なぜsem_waitブロックではないのですか?
- 18. なぜsem_waitにwhileループが必要ないのですか?
- 19. シグナルハンドラでスレッドを作成する
- 20. シグナルハンドラの名前のインストール方法sig_handler
- 21. テストでdjangoシグナルハンドラを接続する
- 22. シグナルハンドラの印刷時間の経過は?
- 23. sigaction(C++)を使用したLinuxのシグナルハンドラ
- 24. シグナルハンドラの存在下でのセグメンテーションフォルト
- 25. シグナルハンドラからスタックトレースを出力する
- 26. シグナルハンドラはどこに戻りますか?
- 27. 私のPOSIXシグナルハンドラの競合条件
- 28. Cシグナルハンドラの教授の例の説明
- 29. シグナルハンドラ内でロングデータを使用する。
- 30. シグナルハンドラ関数がループを維持する
セマフォがどのような種類の操作(スレッド、割り込み、例外など)を追加するかをお勧めします。これは大きな違いになります。 – gnometorule
関連:https://stackoverflow.com/questions/14421951/guaranteeing-mutex-safety-with-async-signals/47304426私は 'sem_wait(&x)'が同じ 'x '上の' sem_wait(&x) 'と衝突するのは明らかに問題だと思うが、技術的に未だ定義されていない振る舞いであっても、 – PSkocik