线程具有属性,用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 简介相关推荐

  1. 线程属性pthread_attr_t简介-转

    本文编辑整理自: http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html http://www.ibm.com/deve ...

  2. linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改

    Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...

  3. 线程属性 pthread_attr_t

    参考资料: https://blog.csdn.net/hudashi/article/details/7709413 Posix线程中的线程属性pthread_attr_t主要包括scope属性.d ...

  4. linux子线程运行的函数_Linux中线程使用详解

    4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...

  5. struct sched_param结构体的运用以及线程属性简单记录

    一.struct sched_param结构体 #include <sched.h> #define sched_ss_low_priority __ss_un.__ss.__ss_low ...

  6. Linux线程属性总结

    http://blog.csdn.net/zsf8701/article/details/7843837 线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. [c]  ...

  7. 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )

    文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...

  8. Linux C++线程池

    这是对pthread线程的一个简单应用 1.      实现了线程池的概念,线程可以重复使用. 2.      对信号量,互斥锁等进行封装,业务处理函数中只需写和业务相关的代码. 3.      移植 ...

  9. Linux多线程实践(3) --线程属性

    初始化/销毁线程属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *att ...

最新文章

  1. hdu1556 线段树段更新(简单题)
  2. 数据库中的实体、元组、字段、属性、码、分量、依赖关系、完全部份传递依赖、范式等你了解吗?【笔记自用】
  3. java胜任理由_Java在几乎所有方面均能胜任本机响应
  4. Axis2;wsdl生成客户端和serverJava代码
  5. package 和 install的区别
  6. 插入公式_word2016编写文档 插入公式选项为暗,不能操作
  7. Linux故障之grub
  8. 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解
  9. JavaScript不采用prototype和new来实现继承机制的方式
  10. 计算机软件技术基础_「连载」信息技术基础题型归纳之计算机软件2
  11. m126a linux驱动下载,惠普hp M126a打印机驱动
  12. 支持hicar的华为手机
  13. Git远程操作详解(clone、remote、fetch、pull、push)
  14. mybaitis-plus 持久层高效开发, 懒人神器
  15. android egl使用方法,Android EGL
  16. BottomNavigationBar+viewpager底部导航切换,出现 Fragment already added
  17. 'Did you install mysqlclient or MySQL-python?' % e 'Did you install mysqlclient or MySQL-pyth
  18. 经常使用的2个google镜像网站
  19. Notebook for Integer Programming (Laurence A. Wolsey) - Well-Solved Problems
  20. 介绍四种绘制词云图的方法

热门文章

  1. MIS开发中C/S模式与B/S模式的结合策略
  2. 先来先服务算法代码_程序员算法与数据结构基础中的基础,栈与递归
  3. 5G LAN — 解决方案示例
  4. Kubernetes — HOST-DEVICE CNI
  5. Ubuntu 20.04 nfs搭建
  6. 不确定函数参数个数时的处理,va_start和va_end使用详解
  7. dubbo源码解析(三十五)集群——cluster
  8. Processing 状态量控制动画技巧
  9. 一致性哈希算法介绍,及java实现
  10. 有人买不?没人的话我待会儿再来问问 价值6.11亿美元的入侵工具无人问津