Linux C编程--线程操作3--线程属性解析
线程属性结构如下:
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 |
0 |
新线程具有系统定义的栈大小。 |
priority |
0 |
新线程的优先级为 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--线程属性解析相关推荐
- Linux C :线程操作和线程同步的多线程并发编程
在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...
- Linux系统编程(九)线程同步
Linux系统编程(九)线程同步 一.什么是线程同步? 二.互斥量 三.条件变量 pthread_cond_wait函数 pthread_cond_signal函数 生产者和消费者模型 一.什么是线程 ...
- Linux系统编程之进程与线程控制原语对比
Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...
- linux网络编程(四)线程池
linux网络编程(四)线程池 为什么会有线程池? 实现简单的线程池 为什么会有线程池? 大多数的服务器可能都有这样一种情况,就是会在单位时间内接收到大量客户端请求,我们可以采取接受到客户端请求创建一 ...
- Linux系统编程(八)线程
Linux系统编程(八)线程 一.什么是线程? 二.Linux内核线程实现原理 线程共享资源 线程非共享资源 线程优缺点 线程控制原语 一.什么是线程? LWP:light weight proces ...
- 嵌入式Linux系统编程学习之三十一线程的属性
文章目录 前言 一.线程属性初始化 二.设置绑定属性 三.设置分离属性 四.获取线程优先级 五.设置优先级 前言 pthread_create 的第 2 个参数 attr 是一个结构体指针,结构体 ...
- linux高级编程基础系列:线程间通信
线程间通信机制: 线程是一种轻量级的进程. 进程的通信机制主要包括无名管道.有名管道.消息队列.信号量.共享内存以及信号等.这些机制都是由linux内核来维护的,实现起来都比较复杂,而且占用大量的系统 ...
- Linux系统编程--守护进程、线程
守护进程 Daemon(精灵)进程,是 Linux 中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或 等待处理某些发生的事件.一般采用以 d 结尾的名字. Linux 后台的一些系统服务 ...
- Linux网络编程3——多进/线程并发服务器
视频链接 黑马程序员-Linux网络编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=37 目录 一.高并发服务器 1.1 图 ...
最新文章
- OpenMP用法大全
- different application signatures解决方法
- 开发日记-20190512 关键词 Dagger2原理
- UseCase事件描述叙事流规范
- 转行数据分析师后悔了?脱颖而出才是关键!
- 可靠性测试设备技术含量_品牌手机厂商为何如此重视可靠性测试,海拓仪器一语道破玄机...
- BCD与ASCII码互转-C语言实现
- android windowmanager 无法传递事件_面试常客:Intent 能传递多大 Size 的数据?| 附阿里的建议方案!...
- 搭建Nodejs环境 创建Express应用
- CC2530休眠-PM2-PM3
- Kaggle_Predict Future Sales_Prac 1(时间序列预测商品销量)
- PS如何把文字的上下间距/行距如调大调小?
- python拨号_Python进行ADSL拨号
- 【摘录】模拟物流快递系统程序设计
- 文本转语音-微软Azure-一步一步教你从注册到使用
- SQL 高级教程:SQL BETWEEN 操作符
- c语言课程设计目的及要求,C语言课程设计目及要求.doc
- 有什么好用的财务分析软件?
- Mac无法安装第三方软件
- XXL-JOB任务调度中心---阻塞处理策略
热门文章
- XSZD00982 流向屏闭
- JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
- View Horizon Mirage安装手册(二)——Mirage规划部署
- sqlite 实例教程 IOS下用sqlite打造词典
- 浅析制造业物料编码在ERP系统中的实施
- iscsi lun extend---windows客户端
- 从《钢铁侠2》看软件测试的重要性
- 初识IBM刀片服务器
- 2006关注IT技术
- 因热爱而编码,创造至美生活,挑战高效工作 阿里云智能开发者创新应用大赛全记录...