线程属性

修改线程的属性


pthread_create的第二个参数pthread_attr_t型参数,是用来设置与线程相关的属性.
属性对象主要包括 是否绑定,是否分离, 堆栈地址, 堆栈大小, 优先级. 默认的属性为非绑定,非分离,缺省1M的堆栈,与父进程同样级别的优先级.


关于线程的绑定, 涉及到另一个概念: 轻进程. 可以理解为内核线程, 它位于用户层与系统层之间. 系统对线程资源分配,对线程的控制都是通过轻进程来实现的,一个轻进程可以控制一个或者多个线程.
默认情况下, 启动多少轻进程, 哪些轻进程来控制哪些线程是由系统来控制的, 这种情况称为非绑定的. 而绑定的顾名思义, 即某个线程固定的"绑"在一个轻进程上. 被绑定的线程具有高的响应速度,
    这是因为CPU的时间片的调试是面向轻进程的, 绑定的线程可以保证在需要的时候它总有一个轻进程可用. 通过设置被绑定的轻进程的优先级和调试级可以使得绑定的线程满足诸如实时反应之类的要求.
    设置线程绑定状态的函数为pthread_attr_setscope, 它有两个参数, 第一个是指向属性的结构的指针, 第二个是绑定类型, 它有两个取值: PTHREAD_SCOPE_SYSTEM(绑定的) 和 PTHREAD_SCOPE_PROCESS(非绑定的).
#include<pthread.h>
pthread_attr_t attr;
pthread_t tid;


pthread_attr_init(&attr);
pthread_attr_setscope( & attr, PTHREAD_SCOPE_SYSTEM);
pthread_create( &tid, &attr, (void *)my_function, NULL);


线程的分离状态决定一个线程以什么样的方式来终止自己. 默认属性为非分离状态, 原有的线程等待创建的线程结束. 只有当pthread_join()函数返回时, 创建的线程才算终止, 才能释放自己占用的系统资源.
而分离线程不是这样的, 它没有被其他的线程所等待, 自己运行结束了, 线程也就终止, 马上释放系统资源. 设置分离状态的函数为pthread_attr_setdetachstate( pthread_attr_t * attr, int detachstate).
第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和PTHREAD_CREATE_JOINABLE(非分离线程). 注意:如果设置一个线程为分离线程, 而这个线程运行又非常快, 它很可能在pthread create函数返回之前就终止,
    它终止以后就可能将线程号和系统资源移交给其他的线程使用, 这样调用pthread_create的线程就得到了错误的线程号. 为了避免这种情况可以采取一定的同步措施,
    最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数, 让这个线程等待一会儿, 留出足够的时间让函数pthread_create返回. 设置一段等待时间, 是在多线程编程里常用的方法,
    但注意不要用诸如wait()之类的函数, 它们是使整个进程睡眠, 并不能解决线程同步的问题.
    另外一个可能常用的属性就是线程的优先级, 它存放在结构sched_param中. 用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放.一般说来, 我们总是先取优先级,
    对取得的值修改后再存放回去. 看一个简单的例子:
#include<pthread.h>
#include<sched.h>
pthread_attr_t attr;
pthread_t tid;
sched_param param;
int newprio = 20;
pthread_attr_init( & attr);
pthread_attr_getschedparam( & attr, & param);
param.sched_priority = newprio;
pthread_attr_setschedparam( & attr, & param);
pthread_create( & tid, & attr, (void*)my_function, myarg);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值