【发布时间】:2012-01-19 12:04:29
【问题描述】:
我需要在信号处理程序(SIGSEGV 信号处理程序,据我所知是每个线程基础)中读取二叉搜索树 (BST)。 BST 可以被应用程序中的其他线程修改。
现在,由于信号处理程序不能使用信号量、互斥锁等,因此无法访问共享数据,我该如何解决这个问题?请注意,我的应用程序是多线程的,并且在多核系统上运行。
【问题讨论】:
-
我会非常非常努力地想办法在信号处理程序中不读取共享数据。
-
为了强调@dbeer 的观点,在信号处理程序中,您通常不应该做任何会阻塞或引发其他信号的事情,或者任何冗长的操作。信号处理程序应该小、快、短。
-
也许我遗漏了一些东西,但如果你的程序的线程只访问共享内存(没有其他中断和异常),你为什么不能使用信号量(是否它的好风格是不同的题)?如果一个线程访问临界区,阻塞它,被另一个线程休眠,信号量仍然为另一个线程锁定,最终你的初始线程将被安排再次访问它。抛开性能原因不谈,我认为既没有数据损坏的危险,也没有导致系统停滞。
-
从理论上讲,在我看来这没问题。例如,内核本身保护仅由异常访问的关键区域,有时仅使用信号量 - 在 UP 和 MP 体系结构中。但是,我对用户空间中的这些问题并没有非常实际的经验,并且可能会忽略一些东西。正如我上面所概述的,我只是不明白在你的情况下它会如何导致问题。
-
在信号处理程序中访问共享数据的危险很容易显示:线程 A 锁定共享数据 X,当它持有锁时它处理一个信号,调用信号处理程序,它试图锁定数据 X. 死锁!
标签: c linux mutex signals signal-handling