2011-12-13 74 views
3

为什么sem_wait不能用于信号处理程序(特别是每个线程的SIGSEGV信号)?有人能给我一个例子,它会使应用程序崩溃吗?我猜sem_wait折返线程安全,所以这里有什么问题?为什么不是异步安全sem_wait和信号处理程序

+0

我建议你添加哪种类型的操作(线程,中断,异常,...)信号量应该保护你。这有很大的不同。 – gnometorule 2011-12-13 17:42:27

回答

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而不是处理它不是更好的目标吗?