线程退出与资源回收

线程退出

单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。
1)线程可以简单地从启动历程中返回,返回值是线程的退出码。
2)线程可以被同一进程中的其他线程所取消。
3)线程调用pthread_exit。

#include <pthread.h>
void pthread_exit(void *rval_ptr);

rval_ptr参数是一个无类型指针。

进程中的其他线程也可以通过调用pthread_join函数访问到这个指针。

#include <pthread.h>
int pthread_join(pthread_t thread,void **rval_ptr);
//成功返回0,否则返回错误编号

调用pthread_join后,调用线程将一直阻塞,直到调用pthread_exit、从启动例程中返回或者被取消。
如果线程简单地从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就设置成PTHREAD_CANCELED。

线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他线程。

#include <pthread.h>
int pthread_cancel(pthread_t tid);//成功返回0,失败返回错误编号

pthread_cancel并不等待线程终止,它仅仅提出请求,线程可以选择忽略取消或者控制如何被取消。

线程资源释放

Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。

线程分为可结合的(joinable)和 分离的(detached)两种,如果没有在创建线程时设置线程的属性为PTHREAD_CREATE_DETACHED,则线程默认是可结合的。
可结合的线程在线程退出后不会立即释放资源,必须要调用pthread_join来显式的结束线程。
分离的线程在线程退出时系统会自动回收资源。

设置分离线程的几种方法:

1.在创建线程时加上

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.在线程中调用pthread_detach(pthread_self());
3.主线程中调用pthread_detach(pid),pid为子线程的线程号
要注意的是,设置为分离的线程是不能调用pthread_join的,调用后会出错。

可结合的线程的几种退出方式

1.子线程使用return退出,主线程中使用pthread_join回收线程。
2.子线程使用pthread_exit退出,主线程中使用pthread_join接收pthread_exit的返回值,并回收线程。
3.主线程中调用pthread_cancel,然后调用pthread_join回收线程。

参考:
1.《unix环境高级编程》—线程终止
2.http://blog.chinaunix.net/uid-29924858-id-4603600.html

猜你喜欢

转载自blog.csdn.net/hmxz2nn/article/details/80041476