前面介绍了pthread_create函数,并且当时的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针。可以使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。可以使用pthread_attr_init函数初始化pthread_attr_t结构。调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。如果要修改其中个别属性的值,需要调用其他的函数。

#include <pthread.h>int pthread_attr_init( pthread_attr_t *attr );int pthread_attr_destroy( pthtread_attr_t *attr );

两个函数的返回值都是:若成功则返回0,否则返回错误编号。

如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy将会释放该内存空间。除此之外,pthread_attr_destroy还会用无效的值初始化属性对象,因此如果该属性对象被误用,将会导致pthread_create函数返回错误。

pthread_attr_t结构对应用程序是透明的,也就是说应用程序并不需要了解有关属性对象内部结构的任何细节,因而可以增强应用程序的可移植性。POSIX.1沿用了这种模型,并且为查询和设置每种属性定义了独立的函数

名称

  描述

detachstate

线程的分离状态属性

guardsize

线程栈末尾的警戒缓冲区大小(字节数)

stackaddr

线程栈的最低地址

stacksize

线程栈的大小(字节数)

如果对现有的某个线程的终止状态不感兴趣的话,可以使用pthread_detach函数让操作系统在线程退出时收回它所占用的资源。

如果在创建线程时就知道不需要了解线程的终止状态,则可以修改pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。可以使用pthread_attr_setdetachstate函数把线程属性detachstate设置为下面的两个合法值之一:设置为PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者设置为PTHREAD_CREATE_JOINABLE,正常启动线程,应用程序可以获取线程的终止状态。

#include <pthread.h>int pthread_attr_getdetachstate( const pthread_attr_t *restrict attr,int *detachstate );int pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate );
两者的返回值都是:若成功则返回0,否则返回错误编号
可以调用pthread_attr_getdetachstate函数获取当前的detachstate线程属性,第二个参数所指向的整数用来保存获取到的detachstate属性值:PTHREAD_CREATE_DETACHED,或PTHREAD_CREATE_JOINABLE)。实例程序:以分离状态创建的线程
#include "apue.h"#include <pthread.h>int
makethread(void *(*fn)(void *), void *arg){int err;pthread_t tid;pthread_attr_t attr;err = pthread_attr_init(&attr);if(err != 0)return(err);err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);if(err == 0)err = pthread_create(&tid, &attr, fn, arg);pthread_attr_destroy(&attr);return(err);}
这里忽略了pthread_attr_destroy函数调用的返回值。在这种情况下,由于对线程属性进行了合理的初始化,pthread_attr_destroy一般不会失败。但是如果pthread_attr_destroy确实出现了失败的情况,清理工作就会变得很困难:必须销毁刚刚创建的线程,而这个线程可能已经运行,并且与pthread_attr_destroy函数可能是异步执行的。忽略pthread_attr_destroy的错误返回可能出现的最坏的情况是:如果pthread_attr_init分配了内存空间,这些内存空间会被泄露。另一方面,如果pthread_attr_init成功地对线程属性进行了初始化,但pthread_attr_destroy在做清理工作时却出现了失败,就没有任何补救策略,因为线程属性结构对应用程序来说是透明的,可以对线程属性结构进行清理的唯一接口是pthread_attr_destroy,但它失败了。
对于遵循POSIX标准的操作系统来说,并不一定要支持线程栈属性,但是对于遵循XSI的系统,支持线程栈属性就是必须的。可以在编译阶段使用_POSIX_THREAD_ATTR_STACKADDR和_POSIX_ATTR_STACKSIZE符号来检查系统是否支持线程栈属性,如果系统定义了这些符号,就说明它支持相应的线程栈属性。也可以通过在运行阶段把_SC_THREAD_ATTR_STACKADDR和_SC_THREAD_ATTR_STACKSIZE参数传给sysconf函数,检查系统对线程栈属性的支持情况。
POSIX.1定义了线程栈属性的一些操作接口。线程栈属性的查询和修改一般是通过较新的函数pthread_attr_getstack和pthread_attr_setstack来进行。
#include <pthread.h>int pthread_attr_getstack( const pthread_attr_t *restrict attr,void **restrict stackaddr,size_t *restrict stacksize );int pthread_attr_setstack( const pthread_attr_t *attr,void *stackaddr, size_t *stacksize );
两者的返回值都是:若成功则返回0,否则返回错误编号。
如果希望改变栈的默认大小,但又不想自己处理线程栈的分配问题,这时使用pthread_attr_setstacksize函数就非常有用。
线程属性guardsize控制着线程栈末尾之后用以避免栈溢出的扩展内存的大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线程属性设为0,从而不允许属性的这种特征行为发生:在这种情况下不会提供警戒缓冲区。同样地,如果对线程属性stackaddr作了修改,系统就会假设我们会自己管理栈,并使警戒栈缓冲区机制无效,等同于把guardsize属性设为0。
#include <pthread.h>int pthread_attr_getguardsize( const pthread_attr_t *restrict attr, size_t *restrict guardsize );int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize );
两者的返回值都是:若成功则返回0,否则返回错误编号
如果guardsize线程属性被修改了,操作系统可能把它取为页大小的整数倍。如果线程的栈指针溢出到警戒区域,应用程序就可能通过信号接收到出错信息。

linux下的线程属性相关推荐

  1. 【Linux下】 线程同步 生产者与消费者模型

    文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...

  2. Linux怎样给线程取名字,Linux下指定线程的名字

    为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字.这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程,对调试程序有一定帮助. prctl是个 ...

  3. Linux下通用线程池的创建与使用

    Linux下通用线程池的创建与使用 本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整 ...

  4. Linux之多线程(上)——Linux下的线程概念

    文章目录 前言 一.地址空间和页表 1.二级页表 2.例子 二.线程 1.概念 重新理解前面讲的进程:在内核的视角,进程是承担分配系统资源的基本实体. 站在CPU角度,能否去识别当前调度的task_s ...

  5. linux 如何查看属性,linux 下查看系统属性

    linux 下查看系统属性 (2009-06-28 19:01:34) 标签: linux 杂谈 分类: OS linux下查看系统属性 1.查看cpu信息 查看所有cpu信息:cat /proc/c ...

  6. Linux下的线程编程

    线程:是进程中的一个实体,是被系统独立调用和分派的基本单位.线程基本上不拥有系统资源,共享进程所拥有的全部资源. 线程与进程的比较:     (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源 ...

  7. Linux下获得线程ID syscall(224)

    From: http://blog.163.com/onx0320@126/blog/static/164736436201252574720314/ 对于Linux线程,也许大家并不陌生,而我们通常 ...

  8. linux下 如何用信号signal 终止或者暂停子线程,linux下实现线程暂停

    记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个.. 刚开始就想到用信号(没办法,正在看auep,只能想到这个) test1: ...

  9. linux下实现线程暂停

    记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个.. 刚开始就想到用信号(没办法,正在看auep,只能想到这个) test1: ...

最新文章

  1. Maven的基础概念
  2. Mysql中实现多表关联查询更新操作
  3. 细谈eclipse PDT开发WordPress插件
  4. 基于RV1126平台imx291分析 --- 基于subdev的方式
  5. 高校水电费管理系统C语言课程设计
  6. 冰点文库下载器,免积分下载百度文库文档
  7. 计算机思维概述ppt,常见的第一讲 计算思维概述.ppt
  8. java求两点间的距离_java计算两点间的距离方法总结
  9. 胜任力模型(competency model)
  10. utorrent设置上传速度_设置好uTorrent让你的下载速度飞起来
  11. easymock 图片_小程序——使用Easy Mock
  12. [乡土民间故事_徐苟三传奇]第卅八回_徐苟三改字赢官司
  13. cf 1487C - Minimum Ties
  14. 云平台是什么、什么是云、云平台的分类、主流公有云平台有哪些、云的三种服务、PaaS、SaaS、IaaS
  15. Python repr()函数
  16. 微芯片植入大脑可保存人们的大脑记忆内容
  17. su PK sudo
  18. MogaFX—日元兑美元30多年来首次突破150日元
  19. 计算机应用技能实验报告实验五,实验五excel应用—制作学生成绩表
  20. 算法笔记:找考试座位号问题

热门文章

  1. Linux 下 top 命令的使用详解
  2. 软件测试模型以及测试方法
  3. vue java 使用AES 前后端加密解密
  4. HTTPS_SSL配置的步骤以及原理说明
  5. 叹西安2014中秋节雨天
  6. Winform 打开下载的文件
  7. Android Service 服务(二)—— BroadcastReceiver
  8. android_Snake
  9. 程序员到底要不要用框架开发?
  10. iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码...