天天看点

pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]

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)才能被释放.

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 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);
//pthread_detach(pthread_self()); 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);

3. 创建线程后用 pthread_join() 一直等待子线程结束。

pthread_join(pid, NULL);

<a href="http://wifihack.net/blog/?attachment_id=447" target="_blank">测试代码下载</a>

继续阅读