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
    1. 应用内存泄漏测试

      检测内存是否正确释放:

    2. int *ptr = (int*)malloc(sizeof(int));...free(ptr);
      1. 多线程测试
      2. 验证多线程程序内存管理的正确性。

        4. 常见问题

        4.1 参数传递问题

        多个线程共享同一个参数值,正确的做法是为每个子线程分配独立的参数存储空间。

        4.2 内存泄漏检查

        使用valgrind进行全面检查,定位和修复内存泄漏问题。

        4.3 内核调试函数

        确保在正式发布前对所有可能的错误进行全面测试,包括设置错误检测和调试功能。

        结论

        通过正确的内存管理和使用valgrind工具,确保多线程程序的内存安全。这样不仅提高了程序的可靠性,也方便了后续的维护和升级工作。

    上一篇:VM:VMware 创建windows10 虚拟机
    下一篇:在Linux/Ubuntu中,创建Clion, Pycharm,IDEA的桌面快捷方式

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年05月03日 10时08分16秒