pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]
来源:互联网 发布:c语言continue 编辑:程序博客网 时间:2024/06/07 12:22
原文:http://wifihack.net/blog/2009/12/pthread-create-join-detach-release-thread/
这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach):
Either pthread_join(3) or pthread_detach() should be called for each thread that an application creates, so that system resources for the thread can be released. (But note that the resources of all threads are freed when the process terminates.)
也就是说:每个进程创建以后都应该调用pthread_join 或 pthread_detach 函数,只有这样在线程结束的时候资源(线程的描述信息和stack)才能被释放.
之后又查了pthread_join 但是没有明确说明必须调用pthread_join 或 pthread_detach.
但是再查了 Pthread for win32 pthread_join
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
才知道如果在新线程里面没有调用pthread_join 或 pthread_detach会导致内存泄漏, 如果你创建的线程越多,你的内存利用率就会越高, 直到你再无法创建线程,最终只能结束进程。
解决方法有三个:
1. 线程里面调用 pthread_detach(pthread_self()) 这个方法最简单
2. 在创建线程的设置PTHREAD_CREATE_DETACHED属性
3. 创建线程后用 pthread_join() 一直等待子线程结束。
下面是几个简单的例子
1. 调用 pthread_detach(pthread_self())
#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *PrintHello(void){pthread_detach(pthread_self());int stack[1024 * 20] = {0,};//sleep(1);long tid = 0;//printf(“Hello World! It’s me, thread #%ld!\n”, tid);//pthread_exit(NULL);}int main (int argc, char *argv[]){pthread_t pid;int rc;long t;while (1) {printf(“In main: creating thread %ld\n”, t);rc = pthread_create(&pid, NULL, PrintHello, NULL);if (rc){printf(“ERROR; return code from pthread_create() is %d\n”, rc);//exit(-1);}sleep(1);}printf(” \n— main End —- \n”);pthread_exit(NULL);}
2. 在创建线程的设置PTHREAD_CREATE_DETACHED属性
#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *PrintHello(void){int stack[1024 * 20] = {0,};//pthread_exit(NULL);//pthread_detach(pthread_self());}int main (int argc, char *argv[]){pthread_t pid;int rc;long t;while (1) {printf(“In main: creating thread %ld\n”, t);pthread_attr_t attr;pthread_t thread;pthread_attr_init (&attr);pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);rc = pthread_create(&pid, &attr, PrintHello, NULL);pthread_attr_destroy (&attr);if (rc){printf(“ERROR; return code from pthread_create() is %d\n”, rc);//exit(-1);}sleep(1);}printf(” \n— main End —- \n”);pthread_exit(NULL);}
3. 创建线程后用 pthread_join() 一直等待子线程结束。
#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *PrintHello(void){int stack[1024 * 20] = {0,};//sleep(1);long tid = 0;//pthread_exit(NULL);//pthread_detach(pthread_self());}int main (int argc, char *argv[]){pthread_t pid;int rc;long t;while (1) {printf(“In main: creating thread %ld\n”, t);rc = pthread_create(&pid, NULL, PrintHello, NULL);if (rc){printf(“ERROR; return code from pthread_create() is %d\n”, rc);//exit(-1);}pthread_join(pid, NULL);sleep(1);}printf(” \n— main End —- \n”);pthread_exit(NULL);}
测试代码下载
0
上一篇:各类 C++ hashmap 性能测试总结
下一篇:Protocol Buffers 的 ActionScript 3 编译器
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]
- Pthread创建线程后必须使用join或detach释放线程资源
- Pthread创建线程后必须使用join或detach释放线程资源
- Pthread创建线程后必须使用join或detach释放线程资源
- Pthread创建线程后必须使用join或detach释放线程资源
- pthread_create()使用detach分离后仍有内存泄漏
- Linux 线程Detach&Join
- Linux 线程Detach&Join
- 一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 线程的join和detach
- pthread_create后没有detach导致内存持续增长
- pthread_create后没有detach导致内存持续增长
- 【windows线程】线程资源创建与释放
- 同一线程多次创建 的 线程资源释放问题在每个线程的一开始,用pthred_detach(pthread_self())来使自己detach掉
- 线程创建函数pthread_create
- linux 创建线程pthread_create
- 如何将动态链接库(C++ DLL)中的printf显示在其被调用的程序控制台上
- Android NDK Build 参数
- [VC]setsockopt 设置socket 详细用法(超时、非阻塞等)
- C++结构体实例和类实例的初始化
- 各类 C++ hashmap 性能测试总结
- pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]
- Protocol Buffers 的 ActionScript 3 编译器
- error C2143: syntax error : missing ';' before 'type'
- Visual Basic 程序设计
- JSON-C Example(从字符串解析属性)
- 如何用VC读取Excel表格中的数据详细介绍
- android 开发 NDK相关问题
- android开发 NDK 编译和使用静态库、动态库
- Android NDK支持RTTI
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
飘 在线
飘英文原版
索绠飘蚊蚋
云飘
地飘球
雀巢飘蓝
飘 中英文对照
飘 译林出版社
飘是形声字吗
干得飘亮
飘home 东四
帝尊飘天
飘快捷酒店
飘 歌曲
纹眉 飘眉
女装飘雷
飘 傅东华
看天空飘的云还有梦
飘home连锁酒店酒仙桥
邪君飘蕊
江乡叶正飘
飘和乱世佳人的区别
听了你就飘
飘英文版txt下载
魔术飘桌
飘home酒店怎么样
我欲封天 飘天
飘home连锁酒店华贸店
翡翠飘绿冰种叶子
林飘鸩鸟翎
轮回 飘沙
大望路飘home酒店电话
鲁宾逊飘游记读后感
飘飘飘仙李飘飘路静梅开二度
飘宣发根活力素效果怎么样
飘home连锁酒店 怎么样
黑暗血时代天下飘火
蓝蓝的天上白云飘
人在江湖飘哪有不挨刀
小树叶飘呀飘儿歌
飘域家园