线程属性API
数据类型:pthread_attr_t
操作API:
// 初始化线程属性
int pthread_attr_init(pthread_attr_t *attr);// 初始化为系统支持的所有属性的默认值
-------------------------------------------------------------------------------------
// 销毁线程属性
int pthread_attr_destroy(pthread_attr_t *attr);// 回收初始化时给此属性分配的资源
1:分离属性
描述:分离线程终止时由系统回收线程资源,而一般线程需要pthread_join(pthread_t)函数来回收资源
// 设置分离线程属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
detachstate可取两个值:
:默认是PTHREAD_CREATE_JOINABLE,不特意设置线程属性时默认是它
:PTHREAD_CREATE_DETACHED(线程分离)
-------------------------------------------------------------------------------------
// 获得分离属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
例:设置分离属性的线程
int makedetachpthread(void *(*fn)(void *), void *arg)
{
int err;
pthread_t tid;
pthread_attr_t attr;
err = pthread_attr_init(&attr);
if(err != ){
return err;
}
err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(err == )
pthread_create(&tid, &attr, fn, arg);
pthread_attr_destroy(&attr);// 这里对destroy的返回值没有检查,默认是能够正确回收attr的资源
return err;
}
2:堆栈大小及起始地址属性
描述:线程的堆栈是使用的进程的堆栈,进程的堆栈是有限的,所以在某些嵌入式程序中会合理设置线程堆栈大小
// 设置线程堆栈大小
/*
如果堆栈空间不足,pthread_create将返回err=12,在<limits.h>中定义#define ENOMEM 12 // Out of memory
设置的栈区大小不能小于PTHREAD_STACK_MIN
*/
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
// 获得当前线程堆栈大小
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
-------------------------------------------------------------------------------------
// 设置线程堆栈大小及自定义堆栈空间
/*
如上所说,进程的堆栈空间是有限的,如果此时堆栈空间已经使用完,而你还想继续创建线程,那么此线程只能放在别处
下面的函数比pthread_attr_setstacksize多了一个stackaddr参数,用于指定放置线程的起始地址(通常是用malloc分配堆
上空间来使用).
*/
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
// 获取线程堆栈的起始地址和堆栈大小
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
3:堆栈警戒区属性
描述:警戒区的意义在于,允许线程在超出线程栈后还能操作一段栈空间(会有警告消息发送给它),
// 设置线程栈警戒区
/*
警戒区默认大小是一页字节guardsize设置为0表示不提供警戒区机制,注意的是:当使用pthread_attr_setstack改变了stackaddr参数后,系统默认应用
程序自己管理警戒区,类似将guardsize设置为0.
*/
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
// 获取线程警戒区大小
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
注:下面的两个线程属性是不包含在pthread_attr_t数据结构中的,分别是取消状态和取消类型。
可知这两个属性是回应pthread_cancel函数的,pthread_cancel函数只是对某个同一线程中的某个线程发出取消请求(好比目标线程调用pthread_exit(PTHREAD_CANCELED)),至于目标线程如何处理这个请求,就是这两个属性来定义的.
1:取消状态属性
// 设置取消状态
int pthread_setcancelstate(int state, int *oldstate)
state取值:
PTHREAD_CANCEL_ENABLE: 默认值,表示接受其他线程pthread_cancel取消信号
PTHREAD_CANCEL_DISABLE: 阻塞线程pthread_cancel取消信号,当状态改为PTHREAD_CANCEL_ENABLE时再依次处理请求
既然本线程收到了取消的请求,那么我什么时候执行取消动作呢?这就引出了取消点的概念,线程会在取消点处处理取消请求(处理方式就是调用pthread_exit(PTHREAD_CANCELED)),取消点可能会出现在下列函数中:

也可以自己设置取消点的位置:
// 手动设置取消点的位置
void pthread_testcancel(void);
当然,设置取消点要生效还是得取消状态值是:PTHREAD_CANCEL_ENABLE的情况下.
2:取消类型属性
前面所讲,获得取消请求之后线程要到取消点才执行取消动作,这其实是一种取消类型属性,叫做延迟取消(deferred cancel)类型,还有一种叫异步取消类型,这种类型就不需要等到取消点才执行取消动作,线程可以在任意时间取消.
// 设置取消类型
int pthread_setcanceltype(int type, int *oldtype)
type取值:
PTHREAD_CANCEL_DEFERRED: 默认值,延迟到取消点才执行取消动作
PTHREAD_CANCEL_ASYNCHRONOUS: 随时会执行取消动作
线程属性API的更多相关文章
- 线程属性总结 线程的api属性
http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程 ...
- 线程池 API (转)
文档原始地址 目录 线程池概述 线程池对象 回调环境对象 工作对象 等待对象 计时器对象 I/O 完成对象 使用清理组简化清理 回调实例 API 随着 Windows Vista® 的发布 ...
- APUE学习之多线程编程(三):线程属性、同步属性
一.线程属性 可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ...
- 线程属性pthread_attr_t
转:http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html1. 线程属性: 使用pthread_attr_t类型表示,我 ...
- 线程操作API
线程操作API 1.currentThread 2.getId() .getName().getPriority().getStart.isAlive().isDaemon().isInterrupt ...
- pthread_attr_t 线程属性(二)
一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthrea ...
- pthread_attr_t 线程属性(一)
1. 线程属性: 使用pthread_attr_t类型表示,我们需要对此结构体进行初始化, 初始化后使用,使用后还要进行去除初始化! ...
- Linux 线程属性函数总结
1.初始化一个线程对象的属性 int pthread_attr_init(pthread_attr_t *attr); 返回值:若是成功返回0,否则返回错误的编号 形 参: attr 指向一个线程属性 ...
- Linux线程属性总结
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. //线程属性结构如下: typedef struct { int etachs ...
随机推荐
- 第二阶段Sprint冲刺会议8
进展:重新规划主界面,把视频录制暂放到主页面里,先实现功能,视频提醒后期再做.
- Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp
题目链接: http://codeforces.com/problemset/problem/535/D D. Tavas and Malekas time limit per test2 secon ...
- nodeJS + webStrome
一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...
- 微信小程序之Flex布局
微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...
- Beta阶段——第二篇 Scrum 冲刺博客
i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 账单收支分明,剩余舍费关联成功 (2) 今天计划完成的工作: 账单删除功能,排序 ...
- git add -A 和 git add . 的区别
git add -A和 git add . git add -u在功能上看似很相近,但还是存在一点差别 git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文 ...
- ucontext-人人都可以实现的简单协程库
ucontext的介绍 http://blog.csdn.net/qq910894904/article/details/41911175 协程的介绍 https://en.wikipedia.org ...
- Mysql 错误相关
有几天没启动本地的 MySQL 了,今天打开小海豚,直接给我弹出了连接失败,这是怎么回事,就直接进入命令行,发现也有问题,输入密码后一闪而过,也没有什么提示信息给我,百度了先,都说是修改 MySQL ...
- servletActionContext.getContext默认获取contextmap 数据默认存储在contextmap的request中
- Backdooring a OS VM
Backdooring a OS VM 来源 https://www.cnblogs.com/studyskill/p/6524672.html 提示: 1.经过实验,fortios 5.4 be ...