linux线程属性

线程属性

  • 本节作为指引性介绍,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(非分离线程)

设置线程分离属性的步骤

  1. 定义线程属性变量 pthread_attr_t attr
  2. 初始化attr, pthread_attr_init(&attr)
  3. 设置线程为分离或非分离 pthread_attr_setdetachstate(&attr,detachstate);
  4. 创建线程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
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值