原子自由记忆

时间:2018-02-20 13:16:38

标签: c memory-management pthreads

这是一个函数,我用来释放动态分配的内存

void Free(void* arg) {
    if(arg!=NULL) {
        free(arg);
        arg=NULL;
    }
}

到目前为止它工作正常,直到我开始使用pthreads。我的堆栈有时会被粉碎,我唯一能做的就是使用pthread_mutex_lock()
是否有任何原子公告可以检查和释放gcc中的内存?
或者你可以提出另一种解决方案吗?我希望mutex不是唯一的方法

1 个答案:

答案 0 :(得分:6)

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

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

在旁注中,您写的函数不会将传入的指针设置为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)