线程属性
- 本节作为指引性介绍,linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。
typedef struct
{
int detachstate; //线程的分离状态
int schedpolicy; //线程的调度策略
struct sched schedparam;//线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //线程栈的设置
void* stackaddr; //线程栈的启始位置
size_t stacksize; //线程栈大小
}pthread_attr_t;
在上面我们可以看到,关于这个结构体中的相关参数
- 线程属性主要包括如下属性:作用域(scope)、栈尺寸(stack size)、栈地址(stack address)、优先级(priority)、分离的状态(detached state)、调度策略和参数(scheduling policy and parameters)。默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。
线程的分离属性
线程的分离状态决定一个线程以什么样的方式来终止自己。
- 非分离状态:线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
- 分离状态:分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。应该根据自己的需要,选择适当的分离状态。
相关函数
- 初始化线程属性——int pthread_attr_init(pthread_attr_t *attr); 成功:0;失败:错误号
- 销毁线程属性所占用的资源——int pthread_attr_destroy(pthread_attr_t *attr); 成功:0;失败:错误号
- 设置线程属性,分离or非分离——int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
- 获取程属性,分离or非分离——int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
- 参数:
- attr:已初始化的线程属性
- detachstate: PTHREAD_CREATE_DETACHED(分离线程);PTHREAD _CREATE_JOINABLE(非分离线程)
设置线程分离属性的步骤
- 定义线程属性变量 pthread_attr_t attr
- 初始化attr, pthread_attr_init(&attr)
- 设置线程为分离或非分离 pthread_attr_setdetachstate(&attr,detachstate);
- 创建线程pthread_create(&tid,&attr,thread_fun,NULL); 所有的系统都会支持线程的分离状态属性,
注意:
- 以默认方式启动的线程,在线程结束后不会自动释放占有的系统资源,要在主控线程中调用pthread_join()后才会释放;
- 以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源,这个时候就不需要调用pthread_join方法了;
- 分离属性在网络通讯中使用的比较多;
- 以分离状态创建的线程就不需要去调用pthread_join了,同时以分离状态去创建的线程,是不能够获取线程返回的结果。
/*DATE: 2019-04-23
*AUTHOR CP
*DESCRIPTION: 设置线程分离属性
*如果在创建线程的时候就知道不需要了解线程的终止状态,那么可以修改pthread_attr_t结构体detachstate属性。
*让线程以分离状态启动。可以使用 pthread_attr_ setdetachstate函数来设置线程的分离状态属性。
*线程的分离属性有
*两种合法值
* PTHREAD_CREATE_DETACHED分离的
* PTHREAD_CREATE_J0INABLE非分离的, 可连接的
* int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
* int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
* 便用 pthread_attr_getdetachstate可以获得线程的分离状态属性
*
* 设置线程分离属性的步骤
* 1.定义线程属性变量 pthread_attr_t attr
* 2.初始化attr, pthread_attr_init(&attr)
* 3.设置线程为分离或非分离 pthread_att