程序因多个线程中的free()调用而随机崩溃

时间:2016-06-08 06:18:13

标签: android c++ multithreading free

我有一段代码,我有类似的东西:

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'

除了互斥锁之外,是否有更好的方法来处理这种情况

PS:我正在使用C ++中的Android本机绑定器,这段代码在onTransact()调用中。

4 个答案:

答案 0 :(得分:1)

如果两个或多个线程试图释放/删除相同的内存,那么代码和设计都会被破坏。虽然线程同步原语会有所帮助,但我也不会使用它们。应该只有一个线程释放内存。理想情况下,它应该是分配内存的人。如果它不同,就像跨线程消息传递的情况一样,仍然只有一个目标线程应该删除内存。

这就像说一个线程打开一个文件,任何线程都会关闭它。它看起来并不好看。文件的关闭应该由单个线程完成,而不是由争用中的多个线程完成。

答案 1 :(得分:0)

两件事:

1)free操作应该是原子的。所以使用任何机制,如互斥,信号量等。

2)free()调用后,显式更新指向NULL的指针。所以在第二个帖子中它不会放入if()

请注意:发送内存后free()调用不会为指针指定NULL。

答案 2 :(得分:0)

由于来自free的{​​{1}}效果很好,无所事事,请使用:

NULL

因此,只有你必须关心的是,操作int *mem_ptr(NULL); . . if(mem_ptr) { //any multithreaded lock guard have to be here free(mem_ptr); mem_ptr = NULL; } 和设置指向free的指针必须是原子的。

这意味着阻止所有其他线程执行这些操作,直到没有完成,这意味着使用核心同步对象。

答案 3 :(得分:0)

您可以将指针指定为NULL,如其他答案中所述......但这仍然不能保证成功。两个线程可以通过并一个接一个地调用free()然后在此之后都分配为NULL ....但是由于你的程序可能已经崩溃太晚了。

您需要在此处使用线程同步机制,如互斥锁:

std::mutex mtx;           // declare mutex for critical section
  :
  :
mtx.lock(); // only one thread will get inside here...
if(mem_ptr)
{
    //any multithreaded lock guard have to be here
    free(mem_ptr);
    mem_ptr = NULL;
}
mtx.unlock(); // release the mutex...