我正在为pthread库创建一个包装器,它允许每个线程拥有自己的一组非共享内存。现在,如果任何线程尝试rwe另一个线程数据,则设置c的方式,程序段错误。这很好,我可以用一个sighandler捕获它并调用pthread_exit()
并继续该程序。
但并不是每一个段错误都会成为一个糟糕的rwe的结果。我需要找到一种方法来使用siginfo类型来确定段错误是编程错误还是错误。有什么想法吗?
由于我使用mmap来管理内存页面,我认为在si_addr
中使用siginfo
会帮助我。
答案 0 :(得分:1)
这听起来像你真正追求的是线程本地存储,它已经解决了比这更容易解决的问题。 GCC提供__thread
,MSVC提供__declspec(thread)
。 boost::thread使用各种机制提供可移植线程本地存储,具体取决于平台/工具链等。
如果你真的想沿着这条路走下去,它可以起作用,但路径充满了危险。从技术上来说,从SIGSEGV恢复是未定义的行为,尽管它可以在很多平台上工作,但它既不健壮也不便携。你需要非常小心你在信号处理程序中所做的事情 - async-safe函数列表,即从信号处理程序合法安全调用的函数列表非常小。
我过去几次成功使用过这个技巧,通常用于在用户空间中将“页面”标记为“脏”。我这样做的方法是设置一个哈希表,其中包含我感兴趣的所有内存“页面”的基地址。当你在处理程序中捕获一个SIGSEGV时,你可以将一个地址映射回一个简单的页面算术运算。如果可以在没有锁的情况下读取哈希表,那么您可以查找这是您关心的页面还是来自其他地方的段错误并决定如何操作。