我处于这样一种情况,我需要在信号处理程序( SIGSEGV 信号处理程序)中读取二进制搜索树(BST),根据我的知识,它是每个线程基础。 BST可以由应用程序中的其他线程修改。
现在由于信号处理程序无法使用信号量,互斥量等因此无法访问共享数据,如何解决此问题?请注意,我的应用程序是多线程的,并在多核系统上运行。
答案 0 :(得分:4)
您不应该从信号处理程序访问共享数据。您可以在以下文章中找到有关信号的更多信息:
Linux Signals for the Application Programmer
The Linux Signals Handling Model
到目前为止,看起来在linux中处理信号最安全的方法是signalfd。
答案 1 :(得分:4)
我可以看到两个非常干净的解决方案:
答案 2 :(得分:3)
假设SH无法直接访问共享数据,那么也许你可以间接地进行访问:
如果您担心重叠SIGSEGV,请在混音中添加一个计数器以跟踪。 (嘿!你刚刚建立了自己的信号量!)
这里的薄弱环节显然是民意调查,但它是一个开始。
答案 3 :(得分:1)
实际上,你会对Gnu Hurd支持external pagers
感到高兴也许你在信号处理程序中读取二进制搜索树的黑客经常可以在实践中,非移植地以及依赖于内核版本的方式工作。也许使用低级非便携技巧(例如futexes和atomic gcc builtins)序列化访问可能会有效。读取NPTL的(机器特定的)源代码,即当前的Linux pthread例程应该有所帮助。
可能是pthread_mutex_lock
等实际上可以从Linux信号处理程序中使用的情况......(因为它可能只有futex
和原子指令。)