线程属性结构如下:

typedef struct
                {
                       int                           detachstate;     线程的分离状态
                       int                          schedpolicy;   线程调度策略
                       struct sched_param      schedparam;   线程的调度参数
                       int                          inheritsched;    线程的继承性
                       int                          scope;          线程的作用域
                       size_t                      guardsize; 线程栈末尾的警戒缓冲区大小
                       int                          stackaddr_set;
                       void *                     stackaddr;      线程栈的位置
                       size_t                      stacksize;       线程栈的大小

                }pthread_attr_t;

属性的缺省值如下:

属性

结果

scope

PTHREAD_SCOPE_PROCESS

新线程与进程中的其他线程发生竞争。 

detachstate

PTHREAD_CREATE_JOINABLE

线程退出后,保留完成状态和线程 ID

stackaddr

NULL

新线程具有系统分配的栈地址。 

stacksize

新线程具有系统定义的栈大小。 

priority

新线程的优先级为 0。 

inheritsched

PTHREAD_EXPLICIT_SCHED

新线程不继承父线程调度优先级。 

schedpolicy

SCHED_OTHER

新线程对同步对象争用使用 Solaris 定义的固定优先级。线程将一直运行,直到被抢占或者直到线程阻塞或停止为止

下面重点介绍对线程属性进行设置的一系列系统函数。

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、获取线程堆栈大小
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针stacksize  返回线程的堆栈大小说  明:获取线程堆栈大小头文件:#include <pthread.h>

4、设置线程堆栈大小
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针guardsize  线程的栈保护区大小:应该是页大小的整数倍说  明:设置线程堆栈大小:头文件:#include <pthread.h>

5、获取线程堆栈地址
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针stackaddr  返回获取的栈地址说  明:函数已过时,一般用pthread_attr_getstack来代替头文件:#include <pthread.h>

6、设置线程堆栈地址
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针stackaddr  设置线程堆栈地址说  明:函数已过时,一般用pthread_attr_setstack来代替头文件:#include <pthread.h>

7、获取线程分离状态属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);返回值:若是成功返回0,否则返回错误的编号形  参:attr          指向一个线程属性的指针detachstate   保存返回的分离状态属性说  明:获取线程分离状态属性头文件:#include <pthread.h>

8、修改线程分离状态属性
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>

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_getinheritsched(pthread_attr_t *attr, int *inheritsched);返回值:若是成功返回0,否则返回错误的编号形  参:attr          指向一个线程属性的指针inheritsched  返回继承调度属性的设置说  明:获取线程是否继承调度属性头文件:#include <pthread.h>

12、设置线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针guardsize  设置线程是否继承调度属性PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程attr中的设置将被忽略PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性值说  明:头文件:#include <pthread.h>

13、获取线程的调度策略
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针policy     返回线程的调度策略说  明:获取线程的调度策略头文件:#include <pthread.h>

14、设置线程的调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针policy     线程的调度策略,有如下三种:SCHED_FIFO    先入先出策略SCHED_RR      轮转调度,类似于 FIFO,但加上了时间轮片算法SCHED_OTHER      系统默认策略说  明:设置线程的调度策略头文件:#include <pthread.h>

15、获取线程的调度参数
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>

16、设置线程的调度参数
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);返回值:若是成功返回0,否则返回错误的编号形  参:attr       指向一个线程属性的指针param      要设置的调度参数说  明:设置线程的调度参数头文件:#include <pthread.h>

下面给出一个实例说明上述函数的用法。

#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>void *my_thread(void *arg)
{int retval=0;pthread_attr_t attr;   //线程属性对象struct sched_param param;   //线程调度参数的结构size_t stacksize;   //线程堆栈大小int        detachstate;   //线程拆卸状态int      scope;    //线程作用域int        inherit;   //线程继承状态int      policy;    //线程调度策略//线程属性对象的初始化if(pthread_attr_init(&attr)==0){//获取线程堆栈的大小if(pthread_attr_getstacksize(&attr,&stacksize)==0){printf("StackSize: %d\n",stacksize);}//获取线程的拆卸状态if(pthread_attr_getdetachstate(&attr, &detachstate)==0){if(detachstate==PTHREAD_CREATE_JOINABLE)printf("DetachState :PTHREAD_CREATE_JOINABLE\n");if(detachstate==PTHREAD_CREATE_DETACHED)printf("DetachState :PTHREAD_CREATE_DETACHED\n");}//获取线程的作用域if(pthread_attr_getscope(&attr, &scope)==0){if(scope==PTHREAD_SCOPE_PROCESS)printf("Scope :PTHREAD_SCOPE_PROCESS\n");if(detachstate==PTHREAD_SCOPE_SYSTEM)printf("Scopee :PTHREAD_SCOPE_SYSTEM\n");}//获取线程的继承调度策略if(pthread_attr_getinheritsched(&attr, &inherit)==0){if(inherit==PTHREAD_INHERIT_SCHED)printf("InheritSched:PTHREAD_INHERIT_SCHED\n");if(inherit==PTHREAD_EXPLICIT_SCHED)printf("InheritSched:PTHREAD_EXPLICIT_SCHED\n");}//获取线程的调度策略if(pthread_attr_getschedpolicy(&attr, &policy)==0){if(policy==SCHED_FIFO)printf("SchedPolicy:SCHED_FIFO\n");if(policy==SCHED_RR)printf("SchedPolicy:SCHED_RR\n");elseprintf("SchedPolicy:SCHED_OTHER\n");}//线程的调度参数if(pthread_attr_getschedparam(&attr, ¶m)==0){printf("SchedPriority:%d\n",param.sched_priority);}pthread_attr_destroy(&attr);}pthread_exit(&retval);
}int main()
{pthread_t  thread;int          *retval;if(pthread_create(&thread,NULL,my_thread,(void *)NULL)!=0){printf("Count not create thread! \n");return -1;}if(pthread_join(thread,(void **)(&retval))!=0){printf("No thread to join! \n");return -2;}return 0;
}

Linux C编程--线程操作3--线程属性解析相关推荐

  1. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

  2. Linux系统编程(九)线程同步

    Linux系统编程(九)线程同步 一.什么是线程同步? 二.互斥量 三.条件变量 pthread_cond_wait函数 pthread_cond_signal函数 生产者和消费者模型 一.什么是线程 ...

  3. Linux系统编程之进程与线程控制原语对比

    Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...

  4. linux网络编程(四)线程池

    linux网络编程(四)线程池 为什么会有线程池? 实现简单的线程池 为什么会有线程池? 大多数的服务器可能都有这样一种情况,就是会在单位时间内接收到大量客户端请求,我们可以采取接受到客户端请求创建一 ...

  5. Linux系统编程(八)线程

    Linux系统编程(八)线程 一.什么是线程? 二.Linux内核线程实现原理 线程共享资源 线程非共享资源 线程优缺点 线程控制原语 一.什么是线程? LWP:light weight proces ...

  6. 嵌入式Linux系统编程学习之三十一线程的属性

    文章目录 前言 一.线程属性初始化 二.设置绑定属性 三.设置分离属性 四.获取线程优先级 五.设置优先级 前言   pthread_create 的第 2 个参数 attr 是一个结构体指针,结构体 ...

  7. linux高级编程基础系列:线程间通信

    线程间通信机制: 线程是一种轻量级的进程. 进程的通信机制主要包括无名管道.有名管道.消息队列.信号量.共享内存以及信号等.这些机制都是由linux内核来维护的,实现起来都比较复杂,而且占用大量的系统 ...

  8. Linux系统编程--守护进程、线程

    守护进程 Daemon(精灵)进程,是 Linux 中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或 等待处理某些发生的事件.一般采用以 d 结尾的名字. Linux 后台的一些系统服务 ...

  9. Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员-Linux网络编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=37 目录 一.高并发服务器 1.1 图 ...

最新文章

  1. OpenMP用法大全
  2. different application signatures解决方法
  3. 开发日记-20190512 关键词 Dagger2原理
  4. UseCase事件描述叙事流规范
  5. 转行数据分析师后悔了?脱颖而出才是关键!
  6. 可靠性测试设备技术含量_品牌手机厂商为何如此重视可靠性测试,海拓仪器一语道破玄机...
  7. BCD与ASCII码互转-C语言实现
  8. android windowmanager 无法传递事件_面试常客:Intent 能传递多大 Size 的数据?| 附阿里的建议方案!...
  9. 搭建Nodejs环境 创建Express应用
  10. CC2530休眠-PM2-PM3
  11. Kaggle_Predict Future Sales_Prac 1(时间序列预测商品销量)
  12. PS如何把文字的上下间距/行距如调大调小?
  13. python拨号_Python进行ADSL拨号
  14. 【摘录】模拟物流快递系统程序设计
  15. 文本转语音-微软Azure-一步一步教你从注册到使用
  16. SQL 高级教程:SQL BETWEEN 操作符
  17. c语言课程设计目的及要求,C语言课程设计目及要求.doc
  18. 有什么好用的财务分析软件?
  19. Mac无法安装第三方软件
  20. XXL-JOB任务调度中心---阻塞处理策略

热门文章

  1. XSZD00982 流向屏闭
  2. JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
  3. View Horizon Mirage安装手册(二)——Mirage规划部署
  4. sqlite 实例教程 IOS下用sqlite打造词典
  5. 浅析制造业物料编码在ERP系统中的实施
  6. iscsi lun extend---windows客户端
  7. 从《钢铁侠2》看软件测试的重要性
  8. 初识IBM刀片服务器
  9. 2006关注IT技术
  10. 因热爱而编码,创造至美生活,挑战高效工作 阿里云智能开发者创新应用大赛全记录...