c - 以原子方式释放内存

标签 c memory-management pthreads

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

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

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

最佳答案

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)

关于c - 以原子方式释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48886200/

相关文章:

c - 了解 pthread_detach

c++ - 在 C++/C 中在后台运行周期性循环

linux - pthread_cond_timedwait ret 22 但 errno 是成功的

用于通过 UART 读取传感器的 C 编程逻辑

c++ - 什么时候在 while 循环上使用 for 循环?

PHP:生产服务器上的内存使用率非常高,而本地计算机上的内存使用率很低

java - 如何监控具有多个服务器/Mule 代理的 Mule 3 ESB 社区版?

c - 从 Linux 桌面启动的程序的默认标准输入和标准输出是什么?

c - 从C中读取未知数量的int的txt文件

c++ - 对象数组是如何存储在内存中的?