为什么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