爲什麼sem_wait
不能用於信號處理程序(特別是每個線程的SIGSEGV信號)?有人能給我一個例子,它會使應用程序崩潰嗎?我猜sem_wait
是折返和線程安全,所以這裏有什麼問題?爲什麼不是異步安全?sem_wait和信號處理程序
3
A
回答
1
如果應用程序在信號量的值爲零時接收到信號,並且接收信號的線程碰巧是應該增加信號量值(sem_post)的那個線程?如果你在信號處理程序中調用sem_wait,這個過程將會死鎖,不是嗎?
另一個參數當然可以是,如果sem_wait不在async-signal-safe函數列表中,則實現可以自由調用鼻子惡魔。
3
異步安全是比線程安全更嚴格的要求。您可以使用基元編寫線程安全代碼,以保護關鍵部分的全局數據。信號處理程序不能依賴於此。例如,你可能在sem_wait中的關鍵部分內,同時做一些導致段錯誤的事情。這會破壞sem_wait的線程安全保護。
1
sem_wait不能在這個原因的信號處理程序使用:
線程A是調用sem_wait上SEM1。線程A完成後,它會發送到sem1。但是,在它完成之前,收到信號並輸入處理程序,在sem1上調用sem_wait。由於A是會發布到sem1的,所以處理程序將永遠不會返回,並且會產生死鎖。這就是爲什麼永遠不要在信號處理程序中等待任何東西。 ASFAIK的問題與死機相關的問題多於崩潰。此外,這違反了信號處理程序的理想目的,即處理外部中斷,然後回到您正在做的事情上。
最後,擺脫SIGSEGV而不是處理它不是更好的目標嗎?
相關問題
- 1. SIGKILL信號處理程序
- 2. 讀信號處理程序
- 3. Perl信號處理程序和WIndows
- 4. Xcode:GDB和信號處理程序
- 5. C++異常和信號處理程序
- 6. 螺紋perl和信號處理程序
- 7. scanf循環和信號處理程序
- 8. 線程中的信號處理程序
- 9. 信號處理程序vs事件處理程序
- 10. Unix線程和信號:每個線程的信號處理程序
- 11. C:信號處理和信號燈
- 12. 執行默認信號處理程序
- 13. Perl 5.10.0信號處理程序問題
- 14. 信號處理程序似乎工作
- 15. 暫停()信號處理程序
- 16. GLib程序終止信號處理?
- 17. 信號處理程序,蟒蛇
- 18. 信號處理程序問題
- 19. 啓用信號處理程序
- 20. 網絡程序員的信號處理
- 21. pthread_exit()在信號處理程序
- 22. 移植OS-9信號處理程序
- 23. django:模擬post_save信號處理程序?
- 24. 信號處理程序的問題
- 25. 信號處理程序與嘆息
- 26. 信號處理 - 異步函數和多線程應用程序,信號棧
- 27. 主/從線程和信號處理
- 28. 多線程信號處理
- 29. 如何編寫sigabrt信號的信號處理程序?
- 30. 所有信號的信號處理程序
我建議你添加哪種類型的操作(線程,中斷,異常,...)信號量應該保護你。這有很大的不同。 – gnometorule 2011-12-13 17:42:27