这是一个函数,我用它来释放动态分配的内存
void Free(void* arg) {
if(arg!=NULL) {
free(arg);
arg=NULL;
}
}
到目前为止它工作正常,直到我开始使用 pthreads。时不时我的堆栈被砸碎,我唯一能做的就是使用 pthread_mutex_lock()
在 gcc 中是否有任何原子公告来检查和释放内存?
或者您可以提出另一种解决方案吗?我希望互斥锁不是唯一的方法
最佳答案
malloc
和free
函数在内部使用互斥体来确保堆得到正确管理。然而,这并不能防止您的应用程序尝试从多个线程读取/写入变量。
每当读取或写入两个或多个线程有权访问的变量时,您需要使用互斥锁来保护该访问。否则你最终会得到不一致的状态并且你无法预测你的程序的行为。
附带说明一下,您编写的函数不会将传入的指针设置为 NULL。它所做的是将局部变量设置为 NULL,这对调用函数是不可见的。为此,它需要接受一个 void **
:
void Free(void **arg) {
if(arg!=NULL) {
free(*arg);
*arg=NULL;
}
}
这样调用:
Free((void **)&ptr);
这是使用宏实际上更干净的情况之一:
#define Free(arg) do { free(arg); (arg) = NULL; } while (0)
关于c - 以原子方式释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48886200/