繁体   English   中英

sem_wait和信号处理程序

[英]sem_wait and signal handler

为什么sem_wait不能在信号处理程序中使用(特别是每个线程的SIGSEGV信号)? 有人可以给我一个示例场景,它会使应用程序崩溃吗? 我猜sem_wait可重入的线程安全的 ,所以这里有什么问题? 为什么它不是异步安全的

异步安全是一个比线程安全更严格的要求。 您可以使用基元编写线程安全代码,以保护关键部分的全局数据。 信号处理程序不能依赖于此。 例如,您可能位于sem_wait内的关键部分内,同时执行导致段错误的操作。 这会破坏sem_wait的线程安全保护。

如果应用程序在信号量的值为零时接收到信号,并且接收信号的线程恰好是应该增加信号量值(sem_post)的线程,该怎么办? 如果你在信号处理程序中调用sem_wait,那么进程会死锁,不是吗?

另一个论点当然可能是,如果sem_wait不在异步信号安全函数列表中,则实现可以自由地调用鼻子恶魔。

由于这个原因,sem_wait不能在信号处理程序中使用:

线程A在sem1上调用sem_wait。 线程A完成后,它会发布到sem1。 但是,在它完成之前,接收信号然后输入处理程序,在sem1上调用sem_wait。 因为A是发布到sem1的那个,所以处理程序永远不会返回,你将遇到死锁。 这就是为什么永远不要等待信号处理程序中的任何事情的原因。 问题,ASFAIK,更多的是死锁而不是崩溃。

此外,这违反了信号处理程序的理想目的,即处理外部中断然后快速恢复到您正在做的事情。

最后,摆脱SIGSEGV而不是处理它不是一个更好的目标吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM