C sem_等待和信号处理器
为什么不能在信号处理程序中使用C sem_等待和信号处理器,c,linux,semaphore,signals,signal-handling,C,Linux,Semaphore,Signals,Signal Handling,为什么不能在信号处理程序中使用sem_wait(尤其是每个线程的SIGSEGV信号)?有人能给我一个示例场景,它将使应用程序崩溃吗?我猜sem\u wait是可重入的和线程安全的,那么这里的问题是什么呢?为什么它不是异步安全的?如果应用程序在信号量值为零时接收到信号,而接收信号的线程恰好是应该增加信号量值的线程(sem\u post),该怎么办?如果然后在信号处理程序中调用sem_wait,进程将死锁,不是吗 当然,另一个论点可能是,如果sem_wait不在异步信号安全函数的列表中,那么实现可以
sem_wait
(尤其是每个线程的SIGSEGV信号)?有人能给我一个示例场景,它将使应用程序崩溃吗?我猜sem\u wait
是可重入的和线程安全的,那么这里的问题是什么呢?为什么它不是异步安全的?如果应用程序在信号量值为零时接收到信号,而接收信号的线程恰好是应该增加信号量值的线程(sem\u post),该怎么办?如果然后在信号处理程序中调用sem_wait,进程将死锁,不是吗
当然,另一个论点可能是,如果sem_wait不在异步信号安全函数的列表中,那么实现可以自由调用NASIC demons。异步安全是比线程安全更严格的要求。您可以使用原语编写线程安全代码,以保护具有关键部分的全局数据。信号处理程序不能依赖于此。例如,您可能在sem_wait中的一个关键部分内,同时执行导致SEGFULT的操作。这将破坏sem_wait的线程安全保护 由于以下原因,sem_wait不能在信号处理程序中使用: 线程A在sem1上调用sem_wait。当线程A完成时,它将发布到sem1。但是,在它完成之前,接收到信号,然后输入处理程序,调用sem_wait on sem1。由于A是一个将发布到sem1的处理程序,因此处理程序将永远不会返回,并且将出现死锁。这就是为什么在信号处理器中永远不要等待任何东西是一条好规则。ASFAIK,问题更多地与死锁有关,而不是崩溃 此外,这违反了信号处理程序的理想用途,即处理外部中断,然后快速返回到您正在执行的操作
最后,摆脱SIGSEGV而不是处理它不是一个更好的目标吗 我建议您添加信号量应该保护您免受的操作类型(线程、中断、异常等)。这有很大的不同。相关:。我认为
sem\u wait(&x)
与sem\u wait(&x)
在同一个x
上发生冲突显然是一个问题,但它应该可以使用不同的信号量,尽管从技术上讲这仍然是未定义的行为。