线程属性对象
索引:
- 初始化属性对象pthread_attr_init
- 删除属性对象pthread_attr_destroy
- 设置分离状态pthread_attr_setdetachstate
- 获取分离状态pthread_attr_getdetachstate
- 设置堆栈防护区大小pthread_attr_setguardsize
- 获得堆栈防护区大小pthread_attr_getguardsize
- 设置域pthread_attr_setscope
- 获取域pthread_attr_getscope
- 设置并发级别pthread_setconcurrency
- 获取并发级别pthread_getconcurrency
- 设置调度策略pthread_attr_setschedpolicy
- 获取调度策略pthread_attr_getschedpolicy
- 设置继承调度策略pthread_attr_setinheritsched
- 获取继承调度策略pthread_attr_getinheritsched
- 设置调度参数pthread_attr_setschedparam
- 获取调度参数pthread_attr_getschedparam
- 设置堆栈大小pthread_attr_setstacksize
- 获取堆栈大小pthread_attr_getstacksize
- 设置堆栈基址pthread_attr_setstackaddr
- 获取堆栈基址pthread_attr_getstackaddr
1.初始化属性对象pthread_attr_init
#include <pthread.h> int pthread_attr_init(pthread_attr_t *attr); 返回值:函数成功返回0;任何其他返回值都表示错误
初始化一个线程属性对象,并将其属性值置成缺省值。它占用的内存由线程库分配。
属性对象的缺省值如下:
属性 | 值 | 说明 |
---|---|---|
scope(线程域) | PTHREAD_SCOPE_PROCESS | 线程是非绑定的,即不是永久的绑定在LWP上 |
Detachstate(分离状态) | PTHREAD_CREATE_JOINABLE | 线程退出后,线程退出代码和线程都将暂时保留 |
Stackaddr(堆栈地址) | NULL | 线程的堆栈由系统分配 |
Stacksize(堆栈大小) | 1M bytes | 线程的堆栈大小由系统决定 |
priority(优先级) | 线程从父线程继承线程的优先级 | |
Inheritsched(继承调度优先级) | PTHREAD_INHERIT_SCHED | 线程继承父线程的调度优先级 |
schedpolicy(调度策略) | SCHED_OTHER | 线程根据优先级调度,线程保持运行,直到更高优先级的线程强占了处理器资源,或是线程被阻塞,或是线程主动出让运行权 |
2.删除属性对象pthread_attr_destroy
#include <pthread.h> int pthread_attr_destroy(pthread_attr_t *attr); 返回值:函数成功返回0;任何其他返回值都表示错误
用来删除属性对象占用的内存。调用这个函数后,相应的属性对象无效。
3.设置分离状态pthread_attr_setdetachstate
#include <pthread.h> int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); 返回值:函数成功返回0;任何其他返回值都表示错误
设置分离状态。参数detachstate的值为:PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOINABLE。
注意:如果没有有效的同步措施,一个刚创建的分离线程有可能在pthread_create()函数返回之前就终止了,而它的线程标识符则被另一个新线程所使用。
4.获取分离状态pthread_attr_getdetachstate
#include <pthread.h> int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate); 返回值:函数成功返回0;任何其他返回值都表示错误
取线程分离状态:分离的或是非分离的。
5.设置堆栈防护区大小pthread_attr_setguardsize
#include <pthread.h> int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); 返回值:函数成功返回0;任何其他返回值都表示错误
设置线程属性对象的堆栈防护区guardsize大小参数。
如果线程属性对象的guardsize参数值为0,那么创建线程时将不会创建堆栈保护区,如果线程属性对象的guardsize参数值大于0,那么使用这个线程属性对象创建的线程将起码有一个guardsize大小的堆栈保护区。
缺省情况下,线程的堆栈保护区大小根据系统版本的不同而各不相同。
创建线程堆栈时,一般的做法是将guardsize参数的值上舍入成系统变量PAGESIZE的整数倍,来分配堆栈保护区。
尽管实际的堆栈保护区大小往往是guardsize参数的上舍入值、PAGESIZE的整数倍。但程序调用pthread_attr_getguardsize()函数来取堆栈保护区的大小时,获得的堆栈保护区大小将是调用pthread_attr_setguardsize()函数时指定的guardsize参数值。
6.获得堆栈防护区大小pthread_attr_getguardsize
#include <pthread.h> int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize); 返回值:函数成功返回0;任何其他返回值都表示错误
取线程属性对象的堆栈保护区大小。
获得的堆栈保护区大小将是调用pthread_attr_setguardsize()函数时指定的guardsize参数值。
7.设置域pthread_attr_setscope
#include <pthread.h> int pthread_attr_setscope(pthread_attr_t *tattr, int scope); 返回值:函数成功返回0;任何其他返回值都表示错误
设置域。指定将来创建的线程是绑定(PTHREAD_SCOPE_SYSTEM)的还是非绑定的(PTHREAD_SCOPE_PROCESS)。
在一个进程中可以同时有这两种不同类型的线程。
8.获取域pthread_attr_getscope
#include <pthread.h> int pthread_attr_getscope(pthread_attr_t *tattr, int *scope); 返回值:函数成功返回0;任何其他返回值都表示错误
取线程的域(绑定的或是非绑定的)。
9.设置并发级别pthread_setconcurrency
#include <pthread.h> int pthread_setconcurrency(int new_level); 返回值:函数成功返回0;任何其他返回值都表示错误
设置线程并发级别。
在一个进程中,可能需要多个非绑定的线程被同时激活(即绑定到LWP上参与核心的并发调度)。缺省情况下,线程库保证有足够多的线程处在激活状态下以确保进程的运行。尽管这样可以节省系统资源,但并不一定能得到最有效的并发性。
该函数允许一个应用程序通知线程库它所需要的并行级别(即同一时刻最多可以有多少个非绑定线程处在激活状态下)。但只是通知系统它所需要的并发级别,系统将它作为一种提示,而不是命令。
如果参数new_level的值为0,并行级别将保持不变,就像该函数从来没有被调用过。
10.获取并发级别pthread_getconcurrency
#include <pthread.h> int pthread_getconcurrency(void);
取线程并发级别。
返回原来由pthread_setconcurrency()函数设置的值。如果在这之前没有调用过pthread_setconcurrency()函数,pthread_getconcurrency()函数将返回0,这表示由线程库维护并发级别。
11.设置调度策略pthread_attr_setschedpolicy
#include <pthread.h> int pthread_attr_setschedpolicy(pthread_attr_t *tattr, int policy); 返回值:函数成功返回0;任何其他返回值都表示错误
设置调度策略。
POSIX标准定义的调度策略有:SCHED_FIFO(先入先出)、SCHED_RR(循环)、SCHED_OTHER(由不同版本的POSIX线程库定义的缺省调度策略)。
12.获取调度策略pthread_attr_getschedpolicy
#include <pthread.h> int pthread_attr_getschedpolicy(pthread_attr_t *tattr, int *policy); 返回值:函数成功返回0;任何其他返回值都表示错误
取调度策略。
13.设置继承调度策略pthread_attr_setinheritsched
#include <pthread.h> int pthread_attr_setinheritsched(pthread_attr_t *tattr, int inherit); 返回值:函数成功返回0;任何其他返回值都表示错误
设置继承调度策略。
如果inherit参数的值为PTHREAD_INHERIT_SCHED(缺省值),那么用这个属性对象创建的线程都将具有父线程的调度策略(属性对象中的调度策略参数将不起作用)。如果inherit参数的值为PTHREAD_EXPLICIT_SCHED,那么用这个属性对象创建线程时,线程的调度策略和父线程无关,属性对象中的调度策略参数将起作用。
14.获取继承调度策略pthread_attr_getinheritsched
#include <pthread.h> int pthread_attr_getinheritsched(pthread_attr_t *tattr, int *inherit); 返回值:函数成功返回0;任何其他返回值都表示错误
获取继承调度策略。
15.设置调度参数pthread_attr_setschedparam
#include <pthread.h> int pthread_attr_setschedparam(pthread_attr_t *tattr, \ const struct sched_param *param); 返回值:函数成功返回0;任何其他返回值都表示错误
设置调度参数。
属性对象的调度参数定义在param结构中;在这个结构中只定义了优先级priority成员。新创建线程的优先级由属性对象中param结构的priority参数指定。
有两种方式可以修改线程的优先级。你可以在创建子线程前设置属性对象的优先级参数;也可以先修改父线程的优先级,然后创建子线程。
sched_param结构中有可能存放着其他一些调度信息。所以在修改线程属性对象的调度参数前先取现有的调度参数是良好的习惯,一段合理的代码应该是这样的:先取线程属性对象中现有的调度参数,对取出的调度参数进行操作,再用修改过的调度参数重置线程属性对象。
16.获取调度参数pthread_attr_getschedparam
#include <pthread.h> int pthread_attr_getschedparam(pthread_attr_t *tattr, \ const struct sched_param *param); 返回值:函数成功返回0;任何其他返回值都表示错误
获取调度参数。
17.设置堆栈大小pthread_attr_setstacksize
#include <pthread.h> int pthread_attr_setstacksize(pthread_attr_t *tattr, int size); 返回值:函数成功返回0;任何其他返回值都表示错误
设置堆栈大小。
参数size表示线程所需堆栈的大小。如果size的值为0。系统使用缺省大小。在大多数情况下,缺省值是最合适的。堆栈的大小不能小于系统定义的最小堆栈容量。
PTHREAD_STACK_MIN是启动一个线程所必须的最小堆栈大小。这当中还不包括执行这个线程中代码所必须的堆栈。
属性对象的stacksize定义了系统为线程分配的堆栈的大小(字节多少)。
18.获取堆栈大小pthread_attr_getstacksize
#include <pthread.h> int pthread_attr_getstacksize(pthread_attr_t *tattr, size_t *size); 返回值:函数成功返回0;任何其他返回值都表示错误
返回由pthread_attr_setstacksize()函数设置的线程堆栈大小。
19.设置堆栈基址pthread_attr_setstackaddr
#include <pthread.h> int pthread_attr_setstackaddr(pthread_attr_t *tattr, void *stackaddr); 返回值:函数成功返回0;任何其他返回值都表示错误
设置线程堆栈的基地址。
如果stackaddr设置为非空值(缺省值是空指针),那么线程堆栈将从这里开始;如果是NULL,那么pthread_create()为线程分配堆栈。
20.获取堆栈基址pthread_attr_getstackaddr
#include <pthread.h> int pthread_attr_getstackaddr(pthread_attr_t *tattr, void **stackaddr); 返回值:函数成功返回0;任何其他返回值都表示错误
返回由pthread_attr_setstackaddr()函数设置的堆栈地址。