
解决这个问题,有2种方式,系统自动释放线程资源,或者由另一个线程释放该线程资源。
注意,在这里,我认为进程运行后,本身,也是一个线程,主线程,主线程和主线程建立的线程共享进程资源。不同于其他线程,在于主线程运行结束后,程序退出,所有程序建立的线程也会退出。
系统自动释放
如果想在线程结束时,由系统释放线程资源,则需要设置线程属性为detach。
代码上,可以这样表示:
pthread_t t
pthread_attr_t a//线程属性
pthread_attr_init(&a) //初始化线程属性
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED) //设置线程属性
::pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (void*)lp) //建立线程
其他线程释放
另一种方式,则是由另一个线程将该资源释放。
代码上,可以这样表示:
pthread_t t
::pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp)
::pthread_join( t)
多线程程序中,特别是频繁申请,释放线程的情况下,就要注意线程的关闭,最好使用线程池。一,线程退出方式
(1) 执行完成后隐式退出;
(2) 由线程本身显示调用pthread_exit 函数退出;
pthread_exit (void * retval)
(3) 被其他线程用pthread_cance函数终止:
pthread_cance (pthread_t thread)
二,线程状态
pthread 线程有两种状态,joinable(非分离)状态和detachable(分离)状态,默认为joinable。
joinable:当线程函数自己返回退出或pthread_exit时都不会释放线程所用资源,包括栈,线程描述符等(有人说有8k多,未经验证)。
detachable:线程结束时会自动释放资源。
joinable 线程执行完后不使用pthread_join的话就会造成内存泄漏。
解决办法:
1、创建线程前设置 PTHREAD_CREATE_DETACHED 属性
pthread_attr_t attr
pthread_t thread
pthread_attr_init (&attr)
pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED)
pthread_create (&thread, &attr, &thread_function, NULL)
pthread_attr_destroy (&attr)
2、当线程为joinable时,使用pthread_join来获取线程返回值,并释放资源。
3、当线程为joinable时,也可在线程中调用 pthread_detach(pthread_self())来分离自己。
执行完成后隐式退出
由线程本身显示调用pthread_exit 函数退出;
pthread_exit (void * retval)
被其他线程用pthread_cance函数终止:
pthread_cance (pthread_t thread)
解决办法:
// 创建线程前设置 PTHREAD_CREATE_DETACHED 属性
pthread_attr_t attr
pthread_t thread
pthread_attr_init (&attr)
pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED)
pthread_create (&thread, &attr, &thread_function, NULL)
pthread_attr_destroy (&attr)
当线程为joinable时,使用pthread_join来获取线程返回值,并释放资源。
当线程为joinable时,也可在线程中调用 pthread_detach(pthread_self())
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)