linux线程的属性

线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。

点击(此处)折叠或打开

  1. //线程属性结构如下:
  2. typedef struct
  3. {
  4.     int etachstate;//线程的分离状态
  5.     int schedpolicy;//线程调度策略
  6.     structsched_param schedparam; //线程的调度参数
  7.     int inheritsched;//线程的继承性
  8.     int scope;//线程的作用域
  9.     size_t guardsize; //线程栈末尾的警戒缓冲区大小
  10.     int stackaddr_set;//线程的栈设置
  11.     void* stackaddr;//线程栈的位置
  12.     size_t stacksize; //线程栈的大小
  13. }pthread_attr_t;

属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。之后须用pthread_attr_destroy函数来释放资源。线程属性主要包括如下属性:作用域(scope)、栈尺寸(stack size)、栈地址(stack address)、优先级(priority)、分离的状态(detached state)、调度策略和参数(scheduling policy and parameters)。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。

1、初始化一个线程对象的属性
int pthread_attr_init(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
    说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
            pthread_attr_init实现时为属性对象分配了动态内存空间。
    头文件:#include <pthread.h>
2、销毁一个线程属性对象
int pthread_attr_destroy(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
    说  明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。
    头文件:#include <pthread.h>
3、获取线程间的CPU亲缘性
int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
    说  明:获取线程的CPU亲缘属性
    头文件:#include <pthread.h>
4、设置线程的CPU亲缘性
int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr         指向一个线程属性的指针
            cpusetsize   指向CPU组的缓冲区大小
            cpuset       指向CPU组的指针
    说  明:通过指定cupset来设置线程的CPU亲缘性
    头文件:#include <pthread.h>
5、获取线程分离状态属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr          指向一个线程属性的指针
            detachstate   保存返回的分离状态属性
    说  明:获取线程分离状态属性
    头文件:#include <pthread.h>
6、修改线程分离状态属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr        指向一个线程属性的指针
            detachstat  有两个取值
                        PTHREAD_CREATE_DETACHED(分离)
                        PTHREAD_CREATE_JOINABLE(非分离)
    说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
    头文件:#include <pthread.h>
7、获取线程的栈保护区大小
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  返回获取的栈保护区大小
    说  明:获取线程的栈保护区大小
    头文件:#include <pthread.h>
8、设置线程的栈保护区大小
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  线程的栈保护区大小
    说  明:参数提供了对栈指针溢出的保护。
            默认为系统页大小
            如果设置为0表示没有保护区。
            大于0,则会为每个使用 attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区
    头文件:#include <pthread.h>
9、获取线程的作用域
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            scope      返回线程的作用域
    说  明:指定了作用域也就指定了线程与谁竞争资源
    头文件:#include <pthread.h>
10、设置线程的作用域
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  线程的作用域,可以取如下值
                       PTHREAD_SCOPE_SYSTEM    与系统中所有进程中线程竞争
                       PTHREAD_SCOPE_PROCESS   与当前进程中的其他线程竞争
    说  明:指定了作用域也就指定了线程与谁竞争资源
    头文件:#include <pthread.h>
11、获取线程的堆栈信息(栈地址和栈大小)
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  返回获取的栈地址
            stacksize  返回获取的栈大小
    说  明:获取线程的堆栈地址和大小
    头文件:#include <pthread.h>
12、设置线程堆栈区
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  线程的堆栈地址:应该是可移植的,对齐页边距的
                       可以用posix_memalign来进行获取
            stacksize  线程的堆栈大小:应该是页大小的整数倍
    说  明:设置堆栈区,将导致pthread_attr_setguardsize失效。
    头文件:#include <pthread.h>
13、获取线程堆栈地址
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  返回获取的栈地址
    说  明:函数已过时,一般用pthread_attr_getstack来代替
    头文件:#include <pthread.h>
14、设置线程堆栈地址
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  设置线程堆栈地址
    说  明:函数已过时,一般用pthread_attr_setstack来代替
    头文件:#include <pthread.h>
15、获取线程堆栈大小
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stacksize  返回线程的堆栈大小
    说  明:获取线程堆栈大小
    头文件:#include <pthread.h>
16、设置线程堆栈大小
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  线程的栈保护区大小:应该是页大小的整数倍
    说  明:设置线程堆栈大小:
    头文件:#include <pthread.h>
17、获取线程的调度策略
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            policy     返回线程的调度策略
    说  明:获取线程的调度策略
    头文件:#include <pthread.h>
18、设置线程的调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            policy     线程的调度策略,有如下三种:
                        SCHED_FIFO    先入先出策略
                        SCHED_RR      轮转调度,类似于 FIFO,但加上了时间轮片算法
                        SCHED_OTHER      系统默认策略
    说  明:设置线程的调度策略
    头文件:#include <pthread.h>
19、获取线程的调度参数
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            param      返回获取的调度参数,该结构仅有一个从参数,如下
                        struct sched_param
                        {
                            int sched_priority; /* Scheduling priority */
                        };
    说  明:获取线程的调度参数
    头文件:#include <pthread.h>
20、设置线程的调度参数
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            param      要设置的调度参数
    说  明:设置线程的调度参数
    头文件:#include <pthread.h>
21、获取线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr          指向一个线程属性的指针
            inheritsched  返回继承调度属性的设置
    说  明:获取线程是否继承调度属性
    头文件:#include <pthread.h>
22、设置线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  设置线程是否继承调度属性
                        PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程
                                               attr中的设置将被忽略
                        PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性值
    说  明:

    头文件:#include <pthread.h>



补充:线程优先级设置

新线程默认情况下是继承父线程的调度策略和优先级的.
对属性对象进行初始化时,即调用pthread_attr_init函数初始化时,初始化为默认属性:绑定(PTHREAD_SCOPE_SYSTEM),非分离(PTHREAD_CREATE_JOINABLE),继承父线程调度策略和优先级(PTHREAD_INHERIT_SCHED).
默认的继承属性是继承父线程的调度策略和优先级,而父线程的调度策略为SCHED_OTHER,优先级为0,所以创建的子线程的调度策略和优先级就继承了父线程的,而不是attr属性指定的。如果把attr里的继承属性改为PTHREAD_EXPLICIT_SCHED,该属性表示新的子线程的调度策略和优先级由自己指定,不继承父线程,那么新建的子线程的调度策略和优先级就是指定的了.
 
线程的调度策略分为3个:SCHED_OTHER,SCHED_FIFO,SCHED_RR。SCHED_OTHER是非实时分时调度策略,线程优先级为0;SCHED_FIFO是实时先进先出调度策略,即一当占用CPU,除非自己阻塞或结束或有更高优先级线程,否则会一直运行,线程优先级为1-99;SCHED_RR是实时分时调度策略,其不会一直占用CPU,运行一个时间片后会让出CPU给自己同优先级的线程;实时调度策略会抢占非实时调度策略.
默认属性创建的线程,其调度策略是SCHED_OTHER,优先级为0.
欲改变新创建线程的调度属性和优先级,则可遵从以下几个步骤来设置.
1. 调用pthread_attr_init来对属性attr进行初始化.
2. 调用pthread_attr_setinheritsched来设置子线程attr属性的继承属性为PTHREAD_EXPLICIT_SCHED,使新线程可自己指定调度策略和优先级.
3. 调用pthread_attr_setschedpolicy来设置新线程的调度策略.
4.调用pthread_attr_setschedparam来设置新线程的优先级.
5. 调用pthread_create创建新线程.
6. 新线程创建完毕后,调用pthread_attr_destroy销毁attr.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值