【发布时间】:2018-07-30 20:53:48
【问题描述】:
这是一个函数,我用来释放动态分配的内存
void Free(void* arg) {
if(arg!=NULL) {
free(arg);
arg=NULL;
}
}
到目前为止,它工作正常,直到我开始使用 pthreads。我的堆栈不时被破坏,我唯一能做的就是使用 pthread_mutex_lock()
是否有任何原子公告来检查和释放 gcc 中的内存?
或者您可以提出另一个解决方案吗?我希望互斥锁不是唯一的方法
【问题讨论】:
-
什么操作系统?在 Linux 上,
malloc和free在内部使用互斥锁。 -
你应该阅读
free的文档。它可以很好地处理NULL本身。而且由于您所修改的只是将其设置为 NULL 的局部变量……老实说,这是一个毫无意义的函数。 -
如果你想分配一个块,让所有线程使用同一个块,然后让所有线程在完成后“释放”块,然后 a) 不要那样做,b) 使用互斥保护的引用计数。 c) 不要这样做,除非你完全没有办法通过重新设计来避免它。
-
@MartinJames 当然,您也可以在程序的主线程中allocate 和free 这样的块。我认为这里的主要问题也是设计。应该有明确的内存块所有权。如果它是跨线程共享的,那么它属于程序,并且应该只在主程序确定所有线程都已完成执行后才
free()ed。 -
你为什么“希望互斥锁不是唯一的方法”,如果需要同时访问数据,那么一个简单的方法就是使用互斥锁,并且根据某些事情,这是一个完全可以接受的解决方案。但也许,有些“某些事情”让你担心,对吧?
标签: c memory-management pthreads