Art*_* Em 0 c memory-management pthreads
这是一个函数,我用来释放动态分配的内存
void Free(void* arg) {
if(arg!=NULL) {
free(arg);
arg=NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止它工作正常,直到我开始使用pthreads.我的堆栈有时会被粉碎,我唯一能做的就是使用pthread_mutex_lock()
是否有任何原子公告来检查和释放gcc中的内存?
或者您可以提出另一种解决方案?我希望互斥体不是唯一的方法
在malloc和free函数使用互斥内部,以确保堆妥善管理.但是,这并不能防止您的应用程序尝试从多个线程读取/写入变量.
无论何时读取或写入两个或多个线程有权访问的变量,您都需要使用互斥锁保护该访问.否则,您最终会出现不一致的状态,并且无法预测程序的行为.
另外,您编写的函数不会将传入的指针设置为NULL.它正在做的是将局部变量设置为NULL,这对于调用函数是不可见的.为此,它需要接受void **:
void Free(void **arg) {
if(arg!=NULL) {
free(*arg);
*arg=NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
并且这样称呼:
Free((void **)&ptr);
Run Code Online (Sandbox Code Playgroud)
这是使用宏实际上更清洁的情况之一:
#define Free(arg) do { free(arg); (arg) = NULL; } while (0)
Run Code Online (Sandbox Code Playgroud)