pthred_create 使用了两种
非分离状态方案,仍有内存泄漏
参见以下以下测试。
使用valgrind 工具检查内存泄漏
gcc -g -o out test.c -lpthread
valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./out
--------------------------------------------------------------------------------------------------
1 无泄漏
#include<stdio.h>
#include<pthread.h>
void* test(){
sleep(2);
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_create(&threadid, NULL, test, NULL);
pthread_join(threadid,NULL);
return 1;
}
--------------------------------------------------------------------------------------------------
2 泄漏
void* test(){
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, test, NULL); 泄漏
pthread_attr_destroy(&attr);
return 1;
}
--------------------------------------------------------------------------------------------------
3 无泄漏
void* test(){
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, test, NULL); 无泄漏
sleep(1); //线程运行完成。
pthread_attr_destroy(&attr);
return 1;
}
--------------------------------------------------------------------------------------------------
4 泄漏
void* test(){
sleep(2);
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadid, &attr, test, NULL); 无泄漏
sleep(1);
pthread_attr_destroy(&attr);
return 1;
}
--------------------------------------------------------------------------------------------------
5 泄漏
void* test(){
pthread_detach(pthread_self());
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_attr_t attr;
pthread_create(&threadid, NULL, test, NULL);
return 1;
}
--------------------------------------------------------------------------------------------------
6 无泄漏
void* test(){
pthread_detach(pthread_self());
printf("ok\n");
}
int main(int argc, char** argv){
pthread_t threadid;
pthread_attr_t attr;
pthread_create(&threadid, NULL, test, NULL);
无泄漏
sleep(1);
return 1;
}
--------------------------------------------------------------------------------------------------