当我们使用默认属性创建一个线程的时候,线程是joinable的,对于一个joinable的线程, 线程创建者要调用pthread_join回收资源,否则可能会存在存储器资源泄漏,而对于datached的线程的存储器资源在它终止时由系统自动释放。
某项目中,用默认方式创建的线程,然后创建线程的函数在返回前忘记调用pthread_join函数,并且创建线程的函数是反复被调用的,这样每调用一次都会创建一个线程,并且没有回收线程资源,测试时发现存在内存泄漏,最后定位为线程资源没有释放。
代码如下
int func(...........) { .....其他代码.....; bTimeExit = true; pthread_t threadTime; ret = pthread_create(&threadTime, NULL, Task_timeout, NULL); ........其他代码.....; bTimeExit = false; return -5; } void * Task_timeout(void *) { struct timeval stamp; long timeSec = 0.0; while(bTimeExit) { .......其他代码.....; } return 0; }
在具体的业务逻辑中,上面的funcA函数是被反复调用的,每次都会创建一个线程,而线程资源又没有回收,因此导致内存泄漏。
对线程设置分离属性之后,用top查看程序的内存消耗不再一直增加,修改方法如下,
方法一:
bTimeExit = true;
pthread_t threadTime;
pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create(&threadTime, &attr, Task_timeout, NULL);
方法二:
bTimeExit = true; pthread_t threadTime; ret = pthread_create(&threadTime, NULL, Task_timeout, NULL); pthread_detach(threadTime);