linux c 线程属性 pthread_attr_t 简介
线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。
调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。
如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy还会用无效的值初始化属性对象,因此如果经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。
typedef struct
{int detachstate; // 线程的分离状态int schedpolicy; // 线程调度策略structsched_param schedparam; // 线程的调度参数int inheritsched; // 线程的继承性int scope; // 线程的作用域size_t guardsize; // 线程栈末尾的警戒缓冲区大小int stackaddr_set; // 线程的栈设置void* stackaddr; // 线程栈的位置size_t stacksize; // 线程栈的大小
} pthread_attr_t;
Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。
pthread_attr_t的主要属性的意义如下:
__detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
__schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、pthread_attr_destroy()和与各个属性相关的pthread_attr_getXXX/pthread_attr_setXXX函数。
在设置线程属性 pthread_attr_t 之前,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。
主要的函数如下:
1、pthread_attr_init
功能: 对线程属性变量的初始化。
2、pthread_attr_setscope
功能: 设置线程 __scope 属性。scope属性表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
3、pthread_attr_setdetachstate
功能: 设置线程detachstate属性。该表示新线程是否与进程中其他线程脱离同步,如果设置为PTHREAD_CREATE_DETACHED则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
4、pthread_attr_setschedparam
功能: 设置线程schedparam属性,即调用的优先级。
5、pthread_attr_getschedparam
功能: 得到线程优先级。
示例
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
static void pthread_func_1 (void);
static void pthread_func_2 (void);int main (int argc, char** argv)
{pthread_t pt_1 = 0;pthread_t pt_2 = 0;pthread_attr_t atrr = {0};int ret = 0;/*初始化属性线程属性*/pthread_attr_init (&attr);pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);if (ret != 0){perror ("pthread_1_create");}ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);if (ret != 0){perror ("pthread_2_create");}pthread_join (pt_2, NULL);return 0;
}static void pthread_func_1 (void)
{int i = 0;for (; i < 6; i++){printf ("This is pthread_1.\n");if (i == 2){pthread_exit (0);}}return;
}static void pthread_func_2 (void)
{int i = 0;for (; i < 3; i++){printf ("This is pthread_2.\n");}return;
}
从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。
linux c 线程属性 pthread_attr_t 简介相关推荐
- 线程属性pthread_attr_t简介-转
本文编辑整理自: http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html http://www.ibm.com/deve ...
- linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改
Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...
- 线程属性 pthread_attr_t
参考资料: https://blog.csdn.net/hudashi/article/details/7709413 Posix线程中的线程属性pthread_attr_t主要包括scope属性.d ...
- linux子线程运行的函数_Linux中线程使用详解
4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...
- struct sched_param结构体的运用以及线程属性简单记录
一.struct sched_param结构体 #include <sched.h> #define sched_ss_low_priority __ss_un.__ss.__ss_low ...
- Linux线程属性总结
http://blog.csdn.net/zsf8701/article/details/7843837 线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. [c] ...
- 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )
文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...
- Linux C++线程池
这是对pthread线程的一个简单应用 1. 实现了线程池的概念,线程可以重复使用. 2. 对信号量,互斥锁等进行封装,业务处理函数中只需写和业务相关的代码. 3. 移植 ...
- Linux多线程实践(3) --线程属性
初始化/销毁线程属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *att ...
最新文章
- hdu1556 线段树段更新(简单题)
- 数据库中的实体、元组、字段、属性、码、分量、依赖关系、完全部份传递依赖、范式等你了解吗?【笔记自用】
- java胜任理由_Java在几乎所有方面均能胜任本机响应
- Axis2;wsdl生成客户端和serverJava代码
- package 和 install的区别
- 插入公式_word2016编写文档 插入公式选项为暗,不能操作
- Linux故障之grub
- 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解
- JavaScript不采用prototype和new来实现继承机制的方式
- 计算机软件技术基础_「连载」信息技术基础题型归纳之计算机软件2
- m126a linux驱动下载,惠普hp M126a打印机驱动
- 支持hicar的华为手机
- Git远程操作详解(clone、remote、fetch、pull、push)
- mybaitis-plus 持久层高效开发, 懒人神器
- android egl使用方法,Android EGL
- BottomNavigationBar+viewpager底部导航切换,出现 Fragment already added
- 'Did you install mysqlclient or MySQL-python?' % e 'Did you install mysqlclient or MySQL-pyth
- 经常使用的2个google镜像网站
- Notebook for Integer Programming (Laurence A. Wolsey) - Well-Solved Problems
- 介绍四种绘制词云图的方法