MxCalloc和MxFree与OpenMP结果双重免费或损坏
MxCalloc and MxFree with OpenMP results double free or corruption
这个问题涉及到大量的代码,所以我将尝试用一些示例代码来给出一个想法。如果有什么我似乎遗漏了,请评论,我会补充更多。总之,我有一个对象,它的方法使用openMP:
#pragma omp parallel
{
int num_thread = omp_get_thread_num();
// This function will allocate and deallocate memory through Mxcalloc and MxFree before returning
foo.get_foo(num_thread);
}
在另一个文件中定义了foo
类(该文件是用-C
标志编译的),并与使用openMP的对象进行了编译和链接。它使用两个方法分配和释放内存:
void foo::alloc(const int &h, const int &w) {
if (value == NULL) {
width = w;
height = h;
value = (double *)mxCalloc(h*w,sizeof(double));
} else {
mexPrintf("Memory has already been allocated when attempting to alloc.n");
}
}
void foo::free() {
if (value != NULL) {
width = 0;
height = 0;
mxFree(value);
value = NULL;
} else {
mexPrintf("Memory has not been allocated yet when attempting to free.n");
}
}
代码在单线程中运行得非常好。但是,当多线程运行时,我得到以下错误:
*** glibc detected *** /usr/local/MATLAB/R2013a/bin/glnxa64/MATLAB: double free or corruption (out): 0x00007f4118019d20 ***
*** glibc detected *** /usr/local/MATLAB/R2013a/bin/glnxa64/MATLAB: malloc(): memory corruption: 0x00007f4101120541 ***
*** glibc detected *** /usr/local/MATLAB/R2013a/bin/glnxa64/MATLAB: double free or corruption (out): 0x00007f412c011260 ***
*** glibc detected *** /usr/local/MATLAB/R2013a/bin/glnxa64/MATLAB: malloc(): memory corruption: 0x00007f4101120541 ***
现在,如果我删除所有free
调用(随后删除所有mxFree
调用),并重新编译/重新运行代码,它似乎工作得很好(我发现这很奇怪,因为对mxFree
的调用只发生在指针不是空的情况下-所以我不知道问题是什么)。所以我把它缩小到mxFree
调用不是线程安全的事实。
我还尝试添加critical
部分,如下所示:
#pragma omp parallel
{
int num_thread = omp_get_thread_num();
// This function will allocate and deallocate memory through Mxcalloc and MxFree before returning
#pragma omp critical
{
foo.get_foo(num_thread);
}
}
代码仍然不起作用,并导致类似的错误消息。所以我的问题是:mxFree
和mxCalloc
是完全非线程安全的-因为它们只有在被单个线程调用时才工作,即使被其他线程独立调用(由critical
部分保证),函数仍然会失败?我很感激任何提示或建议。我在想也许用std::vectors
和resize
代替mxCalloc调用,但我想知道在改变一堆代码之前先发生了什么。
我只是通过我的代码和使用向量与resize
代替mxCalloc
和mxFree
,这解决了我所有的问题。仅供将来参考,绝对避免在任何并行区域中使用MEX API。即使您使用critical
节,它仍然会导致我的linux系统崩溃。这个问题实际上被掩盖了一段时间,因为这个问题在我使用Windows 7的笔记本电脑上没有出现。
cmex API不是线程安全的。根据MathWorks支持团队:
然而,似乎一些 MEX API函数已经变成线程安全的,比如由于MEX API不是线程安全的,因此在生成的线程中不能使用任何MEX API函数…
mexErrMsgIdAndTxt
。动态内存分配似乎还在黑名单上。
使用malloc
和calloc
(或new
和delete[]
)代替mxMalloc
和mxCalloc
。
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用线程和静音时,双免费或损坏(!prev)错误
- IPIV magma_getrs_gpu上的双免费或损坏(OUT)
- 尝试在unordered_map中删除时双免费或损坏
- 范围末尾的C 双免费或损坏错误
- C 双免费或损坏错误
- C++:双倍免费或损坏(out)
- 检测到glibc:双重免费或损坏
- MxCalloc和MxFree与OpenMP结果双重免费或损坏
- 程序结束时双重释放或损坏,没有免费
- 在执行并行版本时,双重免费或损坏(fasttop)
- 在读取/写入文件时双重免费或损坏