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