pthread_create使用不当会造成内存泄漏,对于内存不大的开发板会造成严重后果。
问题:dlna主进程中使用pthread_create创建两个线程scan和inotify,造成内存占用率过大,导致crash。
产生根源:pthread_create默认创建的线程是非detached的。
预防方式:
要么创建detached的线程,要么在非detached线程结束之前detached,或者在主进程中join。
线程的分离状态决定线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,主进程等待新进程结束,只有当pthread_join函数返回时,新进程才终止,才会释放所占有系统资源。而分离线程则不同,不会被主进程等待,运行结束进程也就终止,立即释放系统资源。pthread_create创建的进程默认是分配8M左右的内存空间,该参数可调整,使用不当回造成改内存空间一直被占用,直至主进程结束才一起释放。
避免内存泄露的几种使用方法:
方法一、创建detached的线程
- void run() {
- return;
- }
-
- int main(){
- pthread_t thread;
- pthread_attr_t attr;
- pthread_attr_init( &attr );
- pthread_attr_setdetachstate(&attr,1);
- pthread_create(&thread, &attr, run, 0);
-
- //......
- return 0;
- }
方法二、线程结束之前detached
- void run() {
- pthread_detach(pthread_self());
- }
-
- int main(){
- pthread_t thread;
- pthread_create(&thread, NULL, run, 0);
-
- //......
- return 0;
- }
方法三、主线程使用pthread_join
- void run() {
- return;
- }
-
- int main(){
- pthread_t thread;
- pthread_create(&thread, NULL, run, 0);
-
- //......
- pthread_join(thread,NULL);
- return 0;
- }
其实在linux应用进程中,尝试了上述所有的方法,都并没有起到减少内存资源一直被占用的效果,最后迫不得已采用fork方式取代
pthread_create方式才有减少内存资源占用的效果。