4

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

4

3 回答 3

4

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

于 2011-12-13T17:47:17.443 回答
2

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

线程 A 在 sem1 上调用 sem_wait。当线程 A 完成后,它会发布到 sem1。但是,在它完成之前接收到信号,然后进入处理程序,在 sem1 上调用 sem_wait。由于 A 是要发布到 sem1 的,因此处理程序将永远不会返回,并且您将陷入死锁。这就是为什么永远不要等待信号处理程序中的任何内容是一个很好的规则。ASFAIK 的问题更多地与死锁有关,而不是崩溃。

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

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

于 2011-12-13T21:16:25.453 回答
1

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

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

于 2011-12-13T17:42:48.563 回答