第十章第三节 线程属性
pthread_attr_t结构体定义了一套完整的线程属性,定义如下。
1 | /* |
线程的各种属性均包含在一个字符数组中,线程库定义了一系列函数来操作pthread_attr_t类型的变量,以方便我们获取和设置线程属性。
1 | /* |
下面的函数用于获取和设置线程属性对象的某个属性。
线程的脱离状态
1 | int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * state); |
线程的脱离状态有PTHREAD_CREATE_JOINABLE与PTHREAD_CREATE_DETACH两个可选值。前者指定线程是可回收的,后者使调用线程脱离与进程中其他线程的同步。
线程堆栈
1 | int pthread_attr_getstackaddr(const pthread_attr_t * attr, void * * addr); |
操作系统默认会管理堆栈,Linux默认为每个线程分配足够的堆栈空间(8MB),可使用ulimit -s命令来查看与修改该默认值。
保护区域
1 | int pthread_attr_getguardsize(const pthread_attr_t * attr, size_t * size); |
若保护区域的大小size大于0,则系统创建线程时会在其堆栈的尾部额外分配size字节的空间,作为保护堆栈不被错误覆盖的区域。size为0则不设置保护区域。
此外,若程序使用pthread_attr_setstackaddr或pthread_attr_setstack自行设置线程的堆栈,则guardsize属性将被忽略。
线程调度
1 | int pthread_attr_getschedparam(const pthread_attr_t * attr, struct sched_param * param); |
sched_param是线程的调度参数。该结构体只有一个整型类型的成员——sched_priority,该成员表示线程的运行优先级。
线程调度策略
1 | int pthread_attr_getschedpolicy(const pthread_attr_t * attr, int * policy); |
policy有三种可选值:SCHED_FIFO(先进先出)、SCHED_RR(轮转算法)、SCHED_OTHER(默认);SCHED_FIFO与SCHED_RR都具备实时调度功能,但只能用于以超级用户身份运行的程序。
调度属性的继承
1 | int pthread_attr_getinheritsched(const pthread_attr_t * attr, int * inherit); |
inherit有两个可选值:PTHREAD_INHERIT_SCHED(新线程沿用其创建者的线程调度参数)与PTHREAD_EXPLICIT_SCHED(调用者需明确指定新线程的调度参数)。
线程竞争的范围
1 | int pthread_attr_getscope(const pthread_attr_t * attr, int * scope); |
scope有两个可选值PTHREAD_SCOPE_SYSTEM(目标线程与系统中所有线程一起竞争CPU)与PTHREAD_SCOPE_PROCESS(目标线程仅与其他隶属于同一进程的线程竞争CPU,Linux未实现)。