最近在定位一个创建线程失败的问题,创建线程,线程执行完毕后自动销毁,大概运行1.5天后,就会出现线程创建失败情况。
计算了一下线程创建次数,大概在1800次左右。怀疑是内存不够导致,使用top命令查看内存增长情况,发现有一个进程内存占用率不断增加,检查代码排除掉申请堆空间忘释放情况,上网搜了一下,发现使用pthread_create(&threadid, NULL, func, NULL);形式创建的线程,需要主动释放线程内存空间,否则就会导致内存泄露。该内存仅仅指创建线程时描述表占用的内存空间,不包括线程内存使用malloc申请的堆内存空间。
线程属性分为:分离式和非分离式。分离与非分离主要是指父进程与子进程之间的关系。分离式当线程退出时,内存空间会自动释放,非分离式需要外部线程主动调用内存释放函数pthread_join进行内存释放,否则就会导致内存泄露。
可以通过以下方法来解决线程内存泄露问题:
1、创建线程,使用默认的非分离状态,然后进行使用pthread_join主动释放。
pthread_create(&threadid, NULL, func, NULL);
pthread_join(threadid, &state);
2、创建线程时使用pthread_attr_setdeatchstate()指定线程的属性为PTHREAD_CREATE_DETACHED即为分离式。
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, func, NULL);
pthread_attr_destroy(&attr);
总结:在linux编程中,应该尽量避免频繁创建线程和终止线程。创建线程时,当线程结束时,注意回收线程内存资源。