我正在为 pthread 库制作一个包装器,它允许每个线程拥有自己的一组非共享内存。现在,如果任何线程尝试读取另一个线程的数据,程序就会出现段错误。这很好,我可以用叹息者抓住它并打电话pthread_exit()
并继续执行该程序。
但并不是所有的段错误都是由坏的 RWE 造成的。我需要找到一种方法来使用 siginfo 类型来确定段错误是否是错误的编程或此错误。有任何想法吗?
由于我使用 mmap 来管理内存页面,我认为使用si_addr
in siginfo
会帮助我的。
听起来您真正想要的是线程本地存储,它已经比这更便携地解决了。海湾合作委员会提供__thread
, MSVC 提供__declspec(thread)
. 提升::线程 http://www.boost.org/doc/libs/1_44_0/doc/html/thread/thread_local_storage.html根据平台/工具链等,使用各种机制提供可移植的线程本地存储。
如果你真的想走这条路,它是可行的,但这条路充满了危险。从 SIGSEGV 中恢复在技术上是未定义的行为,尽管它可以在相当多的平台上工作,但它既不健壮也不可移植。不过,您也需要非常小心在信号处理程序中所做的事情 - 列表异步安全 https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers函数,即可以从信号处理程序合法安全调用的函数非常小。
我过去曾多次成功地使用过这个技巧,通常用于将用户空间中的“页面”标记为“脏”。我这样做的方法是设置一个哈希表,其中包含我感兴趣的所有内存“页面”的基地址。当您在处理程序中捕获 SIGSEGV 时,您可以使用简单的方法将地址映射回页面算术运算。如果哈希表可以在没有锁的情况下读取,那么您可以查找这是您关心的页面还是来自其他地方的段错误,并决定如何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)