文章目录
  1. 线程的脱离状态
  2. 线程堆栈
  3. 保护区域
  4. 线程调度
  5. 线程调度策略
  6. 调度属性的继承
  7. 线程竞争的范围

pthread_attr_t结构体定义了一套完整的线程属性,定义如下。

1
2
3
4
5
6
7
/*
引用方式: #include <bits/pthreadtypes.h>
*/
typedef union{
char __size[36];
long int __align;
} pthread_attr_t;

线程的各种属性均包含在一个字符数组中,线程库定义了一系列函数来操作pthread_attr_t类型的变量,以方便我们获取和设置线程属性。

1
2
3
4
5
6
7
8
/*
引用方式: #include <pthread.h>
pthread_attr_init: 初始化线程属性对象
pthread_attr_destroy: 销毁线程属性对象, 被销毁的线程属性对象只有再次初始化才能继续使用
*/
int pthread_attr_init(pthread_attr_t * attr);

int pthread_attr_destroy(pthread_attr_t * attr);

下面的函数用于获取和设置线程属性对象的某个属性。

线程的脱离状态

1
2
3
int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * state);

int pthread_attr_setdetachstate(pthread_attr_t * attr, int state);

线程的脱离状态有PTHREAD_CREATE_JOINABLE与PTHREAD_CREATE_DETACH两个可选值。前者指定线程是可回收的,后者使调用线程脱离与进程中其他线程的同步。

线程堆栈

1
2
3
4
5
6
7
8
9
10
11
int pthread_attr_getstackaddr(const pthread_attr_t * attr, void * * addr);

int pthread_attr_setstackaddr(pthread_attr_t * attr, void * addr);

int pthread_attr_getstacksize(const pthread_attr_t * attr, size_t * size);

int pthread_attr_setstacksize(pthread_attr_t * attr, size_t size);

int pthread_attr_getstack(const pthread_attr_t * attr, void * * addr, size_t * size);

int pthread_attr_setstack(const pthread_attr_t * attr, void * addr, size_t size);

操作系统默认会管理堆栈,Linux默认为每个线程分配足够的堆栈空间(8MB),可使用ulimit -s命令来查看与修改该默认值。

保护区域

1
2
3
int pthread_attr_getguardsize(const pthread_attr_t * attr, size_t * size);

int pthread_attr_setguardsize(pthread_attr_t * attr, size_t size);

若保护区域的大小size大于0,则系统创建线程时会在其堆栈的尾部额外分配size字节的空间,作为保护堆栈不被错误覆盖的区域。size为0则不设置保护区域。

此外,若程序使用pthread_attr_setstackaddr或pthread_attr_setstack自行设置线程的堆栈,则guardsize属性将被忽略。

线程调度

1
2
3
int pthread_attr_getschedparam(const pthread_attr_t * attr, struct sched_param * param);

int pthread_attr_setschedparam(pthread_attr_t * attr, const struct sched_param * param);

sched_param是线程的调度参数。该结构体只有一个整型类型的成员——sched_priority,该成员表示线程的运行优先级。

线程调度策略

1
2
3
int pthread_attr_getschedpolicy(const pthread_attr_t * attr, int * policy);

int pthread_attr_setschedpolicy(pthread_attr_t * attr, int policy);

policy有三种可选值:SCHED_FIFO(先进先出)、SCHED_RR(轮转算法)、SCHED_OTHER(默认);SCHED_FIFO与SCHED_RR都具备实时调度功能,但只能用于以超级用户身份运行的程序。

调度属性的继承

1
2
3
int pthread_attr_getinheritsched(const pthread_attr_t * attr, int * inherit);

int pthread_attr_setinheritsched(pthread_attr_t * attr, int inherit);

inherit有两个可选值:PTHREAD_INHERIT_SCHED(新线程沿用其创建者的线程调度参数)与PTHREAD_EXPLICIT_SCHED(调用者需明确指定新线程的调度参数)。

线程竞争的范围

1
2
3
int pthread_attr_getscope(const pthread_attr_t * attr, int * scope);

int pthread_attr_setscope(pthread_attr_t * attr, int scope);

scope有两个可选值PTHREAD_SCOPE_SYSTEM(目标线程与系统中所有线程一起竞争CPU)与PTHREAD_SCOPE_PROCESS(目标线程仅与其他隶属于同一进程的线程竞争CPU,Linux未实现)。