
使用pthread_create()函数创建线程的时候函数的第二个参数attr用于指定新线程的属性通常在创建线程之前通过 pthread_attr_t 类型的变量来配置线程属性。在不同的操作系统实现中pthread_attr_t 的底层数据结构可能会有所不同但我们不直接访问它的内部成员而是通过 POSIX 提供的 pthread_attr_* 函数接口来初始化、设置或查询其属性。简单介绍一下与线程属性相关的API接口相关API简要说明基本属性管理pthread_attr_init (pthread_attr_t *__attr)初始化 pthread_attr_tpthread_attr_destroy (pthread_attr_t *__attr)销毁属性对象释放相关资源。线程分离状态pthread_attr_getdetachstate(const pthread_attr_t *__attr, int *__detachstate)获取线程的分离状态属性放入 __detachstate。pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate)设置线程的分离状态属性。栈和保护区大小pthread_attr_getguardsize (const pthread_attr_t *__attr, size_t *__guardsize)获取线程栈末尾的警戒缓冲区大小防止栈溢出区域单位是字节。pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize)设置线程栈末尾的警戒缓冲区大小。pthread_attr_getstackaddr (const pthread_attr_t *__restrict __attr, void **__restrict __stackaddr)获取线程栈的起始地址。(返回先前设置的堆栈地址)pthread_attr_setstackaddr (pthread_attr_t *__attr, void *__stackaddr)设置线程栈的起始地址。根据堆栈是增加还是减少该值必须高于或低于内存块中的所有地址。pthread_attr_getstacksize (const pthread_attr_t *__restrict __attr, size_t *__restrict __stacksize)获取线程栈的大小。(返回当前使用的最小堆栈大小)pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize)设置线程栈的大小。(添加有关启动线程所需的最小堆栈大小的信息。这个大小不能小于PTHREAD_STACK_MIN也不能超过系统限制。)调度策略和优先级pthread_attr_getschedparam (const pthread_attr_t *__restrict __attr, struct sched_param *__restrict __param)获取线程的调度参数优先级放入 __param。pthread_attr_setschedparam (pthread_attr_t *__restrict __attr, const struct sched_param *__restrict __param)设置线程的调度参数优先级。pthread_attr_getschedpolicy (const pthread_attr_t *__restrict __attr, int *__restrict __policy)获取线程的调度策略如 SCHED_FIFO、SCHED_RR、SCHED_OTHERpthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)设置线程的调度策略。继承和调度范围pthread_attr_getinheritsched (const pthread_attr_t *__restrict __attr, int *__restrict __inherit)获取线程的调度属性继承方式可以是 PTHREAD_INHERIT_SCHED 或 PTHREAD_EXPLICIT_SCHED。pthread_attr_setinheritsched (pthread_attr_t *__attr, int __inherit)设置线程的调度属性继承方式。pthread_attr_getscope (const pthread_attr_t *__restrict __attr, int *__restrict __scope)获取线程的作用域可以是 PTHREAD_SCOPE_SYSTEM系统范围或 PTHREAD_SCOPE_PROCESS进程内部范围。pthread_attr_setscope (pthread_attr_t *__attr, int __scope)设置线程的作用域。栈和亲和性Linux特有pthread_attr_getstack (const pthread_attr_t *__restrict __attr, void **__restrict __stackaddr, size_t *__restrict __stacksize)获取线程栈的起始地址和大小。pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, size_t __stacksize)设置线程栈的起始地址和大小。pthread_attr_setaffinity_np (pthread_attr_t *__attr, size_t __cpusetsize, const cpu_set_t *__cpuset)设置线程的 CPU 亲和性限制线程在哪些 CPU 上运行非标准接口。pthread_attr_getaffinity_np (const pthread_attr_t *__attr, size_t __cpusetsize, cpu_set_t *__cpuset)获取线程的 CPU 亲和性非标准接口。其他相关接口pthread_getattr_default_np (pthread_attr_t *__attr)获取系统默认的线程属性Linux扩展。pthread_setattr_default_np (const pthread_attr_t *__attr)设置系统默认的线程属性Linux扩展。pthread_attr_setsigmask_np (pthread_attr_t *__attr, const __sigset_t *sigmask)设置线程的信号掩码Linux扩展。pthread_attr_getsigmask_np (const pthread_attr_t *__attr, __sigset_t *sigmask)获取线程的信号掩码Linux扩展。pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)获取现有线程的属性适用于调试或复制线程配置。这些函数使得对线程属性的管理更灵活例如在设置优先级或栈大小时可以根据需要对线程进行细粒度控制。1.相关参数大致说明1pthread_attr_t描述线程属性对象包含了线程的各种属性设置如栈大小、调度策略、分离状态等。2int整型参数用途常用于获取或设置线程的状态例如分离状态、调度策略等。·detachstate表示线程的分离状态取值为 PTHREAD_CREATE_JOINABLE可连接或 PTHREAD_CREATE_DETACHED已分离。·inherit表示调度继承状态取值为 PTHREAD_INHERIT_SCHED 或 PTHREAD_EXPLICIT_SCHED。·scope表示调度范围取值为 PTHREAD_SCOPE_SYSTEM 或 PTHREAD_SCOPE_PROCESS。3struct sched_param描述调度参数结构体包含线程的优先级设置。主要成员int sched_priority表示线程的调度优先级。4size_t描述用于表示大小的无符号整型常用于栈大小和保护区大小等。·guardsize保护区大小指定在栈顶和栈底之间的保护区大小。·stacksize栈大小指定线程的栈的大小。5void *指针参数用途用于指向特定的资源如栈地址或 CPU 亲和性集等。·stackaddr线程栈的起始地址用户可以通过设置这个参数来指定线程的栈位置。·cpusetCPU 亲和性集用于指定线程可以运行在哪些 CPU 上。6cpu_set_t描述用于表示 CPU 亲和性集的数据结构可以通过设置和获取特定 CPU 的亲和性。用途在设置线程的 CPU 亲和性时使用。如果没有其他特别的需求可以直接使用默认属性不需要考虑线程相关属性的情况pthread_create()函数的第二个参数可以设置为NULL如果需要配置用到线程的相关属性通常会先创建一个属性对象然后在属性对象上设置属性的值再将属性对象传给pthread_create()函数的第二个参数2.使用线程属性的流程步骤一般如下1定义一个 pthread_attr_t 类型的变量这个结构体用于存储线程属性。2初始化线程属性使用 pthread_attr_init() 函数来初始化线程属性。3设置所需的线程属性使用各种 pthread_attr_set*() 函数设置具体的属性例如设置栈大小、调度策略等。4创建线程并传递属性在调用 pthread_create() 时将属性传递给它。5销毁线程属性使用 pthread_attr_destroy() 来释放相关资源。3.示例使用线程属性创建一个分离线程#include stdio.h#include stdlib.h#include pthread.h#include unistd.hvoid* thread_function(void* arg) {printf(Thread is running...\n);sleep(2); // 模拟线程工作printf(Thread is exiting...\n);return NULL;}int main() {pthread_t thread;pthread_attr_t attr;// 初始化线程属性pthread_attr_init(attr);// 设置线程为分离状态pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED);// 创建线程if (pthread_create(thread, attr, thread_function, NULL) ! 0) {perror(Failed to create thread);exit(EXIT_FAILURE);}// 销毁线程属性pthread_attr_destroy(attr);// 主线程继续执行printf(Main thread is running...\n);// 由于子线程是分离状态主线程不需要调用 pthread_joinsleep(3); // 等待子线程完成工作printf(Main thread is exiting...\n);return 0;}4.运行结果Main thread is running...Thread is running...Thread is exiting...Main thread is exiting...5.代码解析thread_function()定义一个线程将要执行的函数。pthread_t thread;定义一个线程标识符 thread用于识别和管理线程。pthread_attr_t attr;定义一个线程属性对象 attr用于设置线程的属性。使用 pthread_attr_init 初始化 attr 属性对象以便后续配置线程属性。调用 pthread_attr_setdetachstate 设置线程为分离状态。分离线程在结束时会自动释放其占用的资源不需要主线程调用 pthread_join。pthread_create()函数调用属性参数最后销毁属性对象然后释放相关资源。可以将同一个线程属性对象 pthread_attr_t 应用于多个线程。这种方式有助于统一配置多个线程的属性从而简化代码的维护和管理。设置完线程属性对象 pthread_attr_t 之后可以通过多次调用 pthread_create 函数来创建多个线程。