有没有办法一个进程可以将它的一个内存页面标记为对于 Linux 上的一组特定线程不可写?
背景
我正在尝试在 OpenMP 增强的 C++ 应用程序中调试一个棘手的指针问题。我观察到的行为是程序在随机时间后出现段错误。给定一个二进制文件,它总是在同一个地方出现段错误,但是如果我更改二进制文件(通过注释掉代码或更改编译选项),导致段错误的代码行会更改。每个 OpenMP 线程中完成的工作都是微不足道的。
如果我使用 gdb 检查 segfaulting 线程上的堆栈,我观察到一个已损坏的指针指向一个接近 NULL 的地址。指针变量驻留在堆栈上并指向堆地址。我想让每个 OpenMP 线程将其堆栈标记为对所有其他线程不可写,以确保没有堆栈溢出问题或一个线程在另一个堆栈上行走的其他情况。
设置OMP_STACKSIZE
为较大的值(例如 10M)会使问题消失,但我怀疑这只是运气。据我所知,我正在为任何线程使用 << 100K 的堆栈空间。
valgrind 的 memcheck 报告没有问题。
所有内存分配都在主线程中的单线程代码中执行。如果任何竞争条件处理不当,它们将导致不正确的输出,但不应导致指针问题。
编辑:最终,我发现了我的错误。我正在使用const
具有成员的类的实例mutable
private
进行一些惰性评估。该mutable
成员产生了竞争条件。解决方案是在进入并行块之前触发急切评估。至于标题问题,我怀疑@Damon 的评论是正确的。