Linux线程属性总结
http://blog.csdn.net/zsf8701/article/details/7843837
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。
- //线程属性结构如下:
- typedef struct
- {
- int etachstate; //线程的分离状态
- int schedpolicy; //线程调度策略
- structsched_param schedparam; //线程的调度参数
- int inheritsched; //线程的继承性
- int scope; //线程的作用域
- size_t guardsize; //线程栈末尾的警戒缓冲区大小
- int stackaddr_set; //线程的栈设置
- void* stackaddr; //线程栈的位置
- size_t stacksize; //线程栈的大小
- }pthread_attr_t;
属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。之后须用pthread_attr_destroy函数来释放资源。线程属性主要包括如下属性:作用域(scope)、栈尺寸(stack size)、栈地址(stack address)、优先级(priority)、分离的状态(detached state)、调度策略和参数(scheduling policy and parameters)。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。
一、线程的作用域(scope)
作用域属性描述特定线程将与哪些线程竞争资源。线程可以在两种竞争域内竞争资源:
- 进程域(process scope):与同一进程内的其他线程。
- 系统域(system scope):与系统中的所有线程。一个具有系统域的线程将与整个系统中所有具有系统域的线程按照优先级竞争处理器资源,进行调度。
- Solaris系统,实际上,从 Solaris 9 发行版开始,系统就不再区分这两个范围。
二、线程的绑定状态(binding state)
轻进程(LWP:Light Weight Process)关于线程的绑定,牵涉到另外一个概念:轻进程(LWP:Light Weight Process):轻进程可以理解为内核线程,它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的,一个轻进程可以控制一个或多个线程。
- 非绑定状态
默认状况下,启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的,这种状况即称为非绑定的。 - 绑定状态
绑定状况下,则顾名思义,即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度,这是因为CPU时间片的调度是面向轻进程的,绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。
三、线程的分离状态(detached state)
- 线程的分离状态决定一个线程以什么样的方式来终止自己。
- 非分离状态
线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。 - 分离状态
分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。应该根据自己的需要,选择适当的分离状态。 - 线程分离状态的函数:pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。
第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。
这里要注意的一点是,如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。但是注意不要使用诸如wait()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。
四、线程的优先级(priority)
- 新线程的优先级为默认为0。
- 新线程不继承父线程调度优先级(PTHREAD_EXPLICIT_SCHED)
- 仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
五、线程的栈地址(stack address)
- POSIX.1定义了两个常量_POSIX_THREAD_ATTR_STACKADDR 和_POSIX_THREAD_ATTR_STACKSIZE检测系统是否支持栈属性。
- 也可以给sysconf函数传递_SC_THREAD_ATTR_STACKADDR或 _SC_THREAD_ATTR_STACKSIZE来进行检测。
- 当进程栈地址空间不够用时,指定新建线程使用由malloc分配的空间作为自己的栈空间。通过pthread_attr_setstackaddr和pthread_attr_getstackaddr两个函数分别设置和获取线程的栈地址。传给pthread_attr_setstackaddr函数的地址是缓冲区的低地址(不一定是栈的开始地址,栈可能从高地址往低地址增长)。
六、线程的栈大小(stack size)
- 当系统中有很多线程时,可能需要减小每个线程栈的默认大小,防止进程的地址空间不够用
- 当线程调用的函数会分配很大的局部变量或者函数调用层次很深时,可能需要增大线程栈的默认大小。
- 函数pthread_attr_getstacksize和 pthread_attr_setstacksize提供设置。
七、线程的栈保护区大小(stack guard size)
- 在线程栈顶留出一段空间,防止栈溢出。
- 当栈指针进入这段保护区时,系统会发出错误,通常是发送信号给线程。
- 该属性默认值是PAGESIZE大小,该属性被设置时,系统会自动将该属性大小补齐为页大小的整数倍。
- 当改变栈地址属性时,栈保护区大小通常清零。
八、线程的调度策略(schedpolicy)
POSIX标准指定了三种调度策略:先入先出策略 (SCHED_FIFO)、循环策略 (SCHED_RR) 和自定义策略 (SCHED_OTHER)。SCHED_FIFO 是基于队列的调度程序,对于每个优先级都会使用不同的队列。SCHED_RR 与 FIFO 相似,不同的是前者的每个线程都有一个执行时间配额。SCHED_FIFO 和 SCHED_RR 是对 POSIX Realtime 的扩展。SCHED_OTHER 是缺省的调度策略。
- 新线程默认使用 SCHED_OTHER 调度策略。线程一旦开始运行,直到被抢占或者直到线程阻塞或停止为止。
- SCHED_FIFO
如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM) 的先入先出线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,则会继续处理该线程,直到该线程放弃或阻塞为止。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS)) 的线程或其调用进程没有有效用户 ID 0 的线程,请使用 SCHED_FIFO,SCHED_FIFO 基于 TS 调度类。 - SCHED_RR
如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM)) 的循环线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,并且这些线程没有放弃或阻塞,则在系统确定的时间段内将一直执行这些线程。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS) 的线程,请使用 SCHED_RR(基于 TS 调度类)。此外,这些线程的调用进程没有有效的用户 ID 0。
九、线程并行级别(concurrency)
应用程序使用 pthread_setconcurrency() 通知系统其所需的并发级别。
常用操作函数
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、获取线程间的CPU亲缘性 int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针说 明:获取线程的CPU亲缘属性头文件:#include <pthread.h> 4、设置线程的CPU亲缘性 int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针cpusetsize 指向CPU组的缓冲区大小cpuset 指向CPU组的指针说 明:通过指定cupset来设置线程的CPU亲缘性头文件:#include <pthread.h> 5、获取线程分离状态属性 int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针detachstate 保存返回的分离状态属性说 明:获取线程分离状态属性头文件:#include <pthread.h> 6、修改线程分离状态属性 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> 7、获取线程的栈保护区大小 int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针guardsize 返回获取的栈保护区大小说 明:获取线程的栈保护区大小头文件:#include <pthread.h> 8、设置线程的栈保护区大小 int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针guardsize 线程的栈保护区大小说 明:参数提供了对栈指针溢出的保护。默认为系统页大小如果设置为0表示没有保护区。大于0,则会为每个使用 attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区头文件:#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_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针stackaddr 返回获取的栈地址stacksize 返回获取的栈大小说 明:获取线程的堆栈地址和大小头文件:#include <pthread.h> 12、设置线程堆栈区 int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针stackaddr 线程的堆栈地址:应该是可移植的,对齐页边距的可以用posix_memalign来进行获取stacksize 线程的堆栈大小:应该是页大小的整数倍说 明:设置堆栈区,将导致pthread_attr_setguardsize失效。头文件:#include <pthread.h> 13、获取线程堆栈地址 int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针stackaddr 返回获取的栈地址说 明:函数已过时,一般用pthread_attr_getstack来代替头文件:#include <pthread.h> 14、设置线程堆栈地址 int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针stackaddr 设置线程堆栈地址说 明:函数已过时,一般用pthread_attr_setstack来代替头文件:#include <pthread.h> 15、获取线程堆栈大小 int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针stacksize 返回线程的堆栈大小说 明:获取线程堆栈大小头文件:#include <pthread.h> 16、设置线程堆栈大小 int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针guardsize 线程的栈保护区大小:应该是页大小的整数倍说 明:设置线程堆栈大小:头文件:#include <pthread.h> 17、获取线程的调度策略 int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针policy 返回线程的调度策略说 明:获取线程的调度策略头文件:#include <pthread.h> 18、设置线程的调度策略 int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针policy 线程的调度策略,有如下三种:SCHED_FIFO 先入先出策略SCHED_RR 轮转调度,类似于 FIFO,但加上了时间轮片算法SCHED_OTHER 系统默认策略说 明:设置线程的调度策略头文件:#include <pthread.h> 19、获取线程的调度参数 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> 20、设置线程的调度参数 int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针param 要设置的调度参数说 明:设置线程的调度参数头文件:#include <pthread.h> 21、获取线程是否继承调度属性 int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针inheritsched 返回继承调度属性的设置说 明:获取线程是否继承调度属性头文件:#include <pthread.h> 22、设置线程是否继承调度属性 int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);返回值:若是成功返回0,否则返回错误的编号形 参:attr 指向一个线程属性的指针guardsize 设置线程是否继承调度属性PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程attr中的设置将被忽略PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性值说 明:头文件:#include <pthread.h>
Linux线程属性总结相关推荐
- Linux线程属性及优先级设置
Linux线程属性及优先级设置 [原文引自]http://hikesoso2010.spaces.eepw.com.cn/articles/article/item/86413# 线程的属性由pthr ...
- Linux线程属性总结 http://blog.csdn.net/zsf8701/article/details/7842392
Linux线程属性总结 分类: Linux 2012-08-08 11:05 3657人阅读 评论(2) 收藏 举报 linux thread solaris concurrency syst ...
- linux设置进程优先级,Linux线程属性及优先级设置
POSIX.1线程属性及优先级设置 By zieckey All Right Reserved 线程的属性由pthread_attr_t结构类型表示. 在使用pthread_attr_t之前,需要调用 ...
- Linux 线程属性的使用
线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化.我们用pthread_attr_init函数对其初始化,用pthread_ ...
- linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改
Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...
- Linux多线程实践(3) --线程属性
初始化/销毁线程属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *att ...
- Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)
对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...
- linux多线程学习(三)——线程属性设置
在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用.其中pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的.这些属性主要包括邦定属性.分离属性.堆栈地址. ...
- linux c 线程属性 pthread_attr_t 简介
线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化. 调用pthread_attr_init之后,pthread_t结构所包含的内容就是 ...
最新文章
- SQL的优化和注意事项
- 关于内存对齐介绍的比较好的一个文章
- 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法
- cocos2d-html5 碰撞检测的几种方法
- Java基础(三)--final关键字
- MacBook 键盘出现故障,如何修复?
- 计算机算法设计与分析 第5版 (王晓东) 课后答案[解析]
- 微信小程序 下拉刷新 上拉触底分页
- Java根据出生日期判断星座
- XBee无线模块的通信方式和结合Arduino的具体实施过程
- AtCoder Beginner Contest 061(CD)
- python英文文本情感分析_舆情信息浩如烟海?看看如何用Python进行英文文本的情感分析...
- java计算机毕业设计ssm+vue酒店VIP客户管理系统
- Android实现3DTouch效果
- Sql中TO_DAYS,DATE_SUB等时间函数介绍
- Win未检测出摄像头
- 软件开发、系统定制、小程序等怎么报价?
- 如何用python写一个把文件大小字节数转换为KB,MB,GB,TB等单位的函数
- 3D语音天气球(源码分享)——完结篇
- 远程服务器 一闪就没有了,远程桌面连接一闪而过的解决方法