原子自由记忆

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中的内存?
或者您可以提出另一种解决方案?我希望互斥体不是唯一的方法

dbu*_*ush 6

mallocfree函数使用互斥内部,以确保堆妥善管理.但是,这并不能防止您的应用程序尝试从多个线程读取/写入变量.

无论何时读取或写入两个或多个线程有权访问的变量,您都需要使用互斥锁保护该访问.否则,您最终会出现不一致的状态,并且无法预测程序的行为.

另外,您编写的函数不会将传入的指针设置为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)