我有一段代码,里面有类似的东西:
int *mem_ptr;
.
.
if(mem_ptr)
{
free(mem_ptr);
}
.
.
应用程序是多线程的。有时,一个线程通过了 if
检查,然后在 free()
上下文切换发生之前,另一个线程也通过了 if
检查,也执行 free()
。现在,当控件返回到第一个线程时,它会在 free()
处崩溃并给出错误 Abort message: 'invalid address or address of corrupt block 0x40735cb0 passed to dlfree'
。
除了mutex,有没有更好的办法来处理这种情况
PS:我正在使用 C++ 开发 Android native 绑定(bind)程序,这段代码在 onTransact()
调用中。
最佳答案
如果两个或多个线程试图释放/删除相同的内存,那么代码和设计都会被破坏。虽然线程同步原语会有所帮助,但我也不会使用它们。应该只有一个线程释放内存。理想情况下,它应该是分配内存的人。如果不同,如跨线程消息传递的情况,仍然只有一个目标线程应该删除内存。
这就像说一个线程打开一个文件,任何线程都会关闭它。看起来不太好。文件的关闭应该由单线程完成,而不是由争用的多个线程完成。
关于android - 由于多线程中的 free() 调用导致程序随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37694647/