我处于需要读取信号处理程序(SIGSEGV信号处理程序,据我所知是每个线程库)内的二叉搜索树(BST)的情况。BST 可以被应用程序中的其他线程修改。
现在,由于信号处理程序不能使用信号量、互斥锁等,因此无法访问共享数据,我该如何解决这个问题?请注意,我的应用程序是多线程的,并且在多核系统上运行。
我处于需要读取信号处理程序(SIGSEGV信号处理程序,据我所知是每个线程库)内的二叉搜索树(BST)的情况。BST 可以被应用程序中的其他线程修改。
现在,由于信号处理程序不能使用信号量、互斥锁等,因此无法访问共享数据,我该如何解决这个问题?请注意,我的应用程序是多线程的,并且在多核系统上运行。
我可以看到两个非常干净的解决方案:
您不应该从信号处理程序访问共享数据。您可以在以下文章中找到有关信号的更多信息:
到目前为止,看起来在 linux 中处理信号最安全的方法是 signalfd。
假设 SH 不能直接访问共享数据,那么也许你可以间接地做到这一点:
如果您担心重叠的 SIGSEGV,请在混合中添加一个计数器以跟踪。(嘿!你刚刚建立了自己的信号量!)
这里的薄弱环节显然是轮询,但它是一个开始。
您可能会考虑mmap -ing保险丝文件系统(在用户空间中)。
也许您在信号处理程序中读取二叉搜索树的技巧通常可以在实践中工作,不可移植并且以依赖于内核版本的方式。也许使用低级不可移植技巧(例如futexes和atomic gcc builtins)序列化访问可能会起作用。阅读 NPTL 的(特定于机器的)源代码,即当前的 Linux pthread 例程应该会有所帮助。
可能的情况是pthread_mutex_lock
etc 实际上可以从 Linux 信号处理程序内部使用......(因为它可能只做futex
原子指令)。