
c语言多线程返回值以及内存回收的问题
线程标识符数组:线程结束后,释放存储线程标识符的数组。 参数数组:所有子线程退出后,释放传递参数的数组。 计算结果数组:在子线程返回结果后,主线程释放相应内存,防止泄漏。
发布日期:2021-05-28 16:53:28
浏览次数:39
分类:精选文章
本文共 2210 字,大约阅读时间需要 7 分钟。
C语言多线程内存管理与valgrind检测总结
1. 背景
编写一个C语言的多线程小程序,涉及到多线程、参数传递、结果返回以及内存泄漏的问题。为了确保内存的安全性,使用了valgrind工具进行内存检查。以下将详细介绍实现过程及解决方案。
2. 代码实现
2.1 代码逻辑
线程创建:
- 主线程创建并管理多个子线程。
- 每个子线程负责计算一个数的平方并返回结果。
内存管理:
- 使用malloc分配内存,确保动态内存的正确分配和释放。
- 子线程结束后释放内存,防止内存泄漏。
参数传递:
- 正确传递参数,确保每个子线程获得独特的参数。
2.2 代码详解
2.2.1 函数实现
#include#include #include #include void *func_work(void *arg) { int val = *(int*)arg; int *res = (int*)malloc(sizeof(int)); *res = val * val; sleep(1); // 为观察输出顺序保留 printf("func_work arg=%d res=%d arg_addr=%p res_addr=%p\n", val, *res, arg, res); return res;}int main() { int num = 5; if (num < 1) { printf("0\n"); return 0; } pthread_t *thread_id_arr = (pthread_t**)malloc(num * sizeof(pthread_t)); int *val_arr = (int*)malloc(num * sizeof(int)); int sum = 0; for (int i = 0; i < num; i++) { val_arr[i] = i; // 存储当前子线程的计算参数 pthread_create(&thread_id_arr[i], NULL, func_work, (void*)val_arr[i]); printf("pthread_create i=%d val_arr_addr=%p\n", i, val_arr + i); } sleep(2); // 为了观察顺序保留 for (int i = 0; i < num; i++) { void *res; pthread_join(thread_id_arr[i], &res); printf("pthread_join i=%d res=%d res_addr=%p\n", i, *(int*)res, res); sum += *(int*)res; free(res); // 释放计算结果的内存 res = NULL; // 防止悬垂指针 } free(thread_id_arr); // 释放线程数组 free(val_arr); // 释放参数数组 printf("sum = %d\n", sum); return 0;}
2.2.2 内存释放重点
2.3 测试结果
运行测试后,使用valgrind检测内存泄漏,结果无误:
valgrind -q --leak-check=full --error-exitcode=100 ./main
输出显示内存管理正确,且sum值为30。
3. 内存检测
3.1 安装valgrind
sudo apt install valgrind
3.2 使用valgrind进行测试
简单的Hello World程序:
使用valgrind检测内存泄漏:
gcc main.c -o mainvalgrind -q --leak-check=full --error-exitcode=100 ./main
应用内存泄漏测试:
检测内存是否正确释放:
- 多线程测试:
int *ptr = (int*)malloc(sizeof(int));...free(ptr);
验证多线程程序内存管理的正确性。
4. 常见问题
4.1 参数传递问题
多个线程共享同一个参数值,正确的做法是为每个子线程分配独立的参数存储空间。
4.2 内存泄漏检查
使用valgrind进行全面检查,定位和修复内存泄漏问题。
4.3 内核调试函数
确保在正式发布前对所有可能的错误进行全面测试,包括设置错误检测和调试功能。
结论
通过正确的内存管理和使用valgrind工具,确保多线程程序的内存安全。这样不仅提高了程序的可靠性,也方便了后续的维护和升级工作。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月03日 10时08分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JS代码执行顺序
2019-03-21
免费好用的证件扫描仪-扫描全能王
2019-03-21
自定义拦截器
2019-03-21
自定义拦截器
2019-03-21
Eclipse 代码规范配置
2019-03-21
Kafka Producer机制优化-提高发送消息可靠性
2019-03-21
面试题5:(事务管理) ACID 是什么?
2019-03-21
ASCII码表
2019-03-21
剑指 Offer 20. 表示数值的字符串
2019-03-21
10.Mybatis执行流程
2019-03-21
【车间调度】遗传算法求解混合流水车间调度最优问题【Matlab 017期】
2019-03-21
NoSql的四大分类
2019-03-21
Oracle 一张表里面按照一个字段值将所有的数据按逗号拆分,变为多行数据
2019-03-21
DRF框架(十四)——过滤Filtering,排序
2019-03-21
【ucosII】4.事件管理
2019-03-21
【ucosII】5.消息队列
2019-03-21
阿里云网盘注册邀请码怎么获得,阿里云网盘注册邀请码获得内测方法
2019-03-21
Jmeter函数与变量使用详解(下)-32
2019-03-21
数模新版视频课程第5讲.相关系数
2019-03-21
数模新版视频课程第7讲:多元线性回归分析
2019-03-21