线程属性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 ...
随机推荐
- react-native ListView 性能问题
常见性能问题已经有很多答案,这里要说的是使用ListView时注意的地方, ListView的容器需要设定一个固定高度, 不然ListView中的item过多,会把整体页面撑开,设置的 remo ...
- linux命令系列 stat & touch
1. stat - display file or file system status stat命令主要用于显示文件或文件系统的状态,详细信息 事实上,stat命令显示的是文件的I节点信息.Linu ...
- Django_信号
目录 Django信号介绍 Django内置信号 信号种类 信号注册 自定义信号 实测 内置信号 自定义信号 Django信号介绍 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲 ...
- Scrum立会报告+燃尽图(Final阶段第三次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...
- Daily Scrum (2015/10/22)
今天我们发现了源代码并不能直接在PC上运行.通过学长我们了解到我们需要在服务器上链接上数据库才能正常运行,所以找了老师要了地址后进入了正常工作.由此我们的PM增添了一些新的任务,团队的总工作时间有所增 ...
- Linux基础入门--06
简单的文本处理 实验介绍 这一节我们将介绍这几个命令:tr.col.join.paste 1.tr: -d:删除和set1匹配的字符,不是全词匹配也不是按字符顺序匹配 -s:除去指定的连续并重复的字符 ...
- 20145214《网络攻防》逆向及Bof基础实践
20145214<网络攻防>逆向及Bof基础实践 实践说明 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...
- arcgis 10.3中文版安装教程、配置及常见问题(百度的有些错误)
参考的: 1.http://wenku.baidu.com/link?url=W-wo_lEMvzHxF19w91X7H0WDjyCQ16DjGu4ViaZ4-eVPr0NTU-LrZTPK1oyzT ...
- 阅读 DPDK 中文论文两则
基于DPDK的高效数据包捕获技术分析与应用 本文应用场景 网络安全领域的数据包捕获技术,对系统有高性能需求,要在短时间内成功收集.分析.处理大量数据,实时捕获效率低下. 旧有传统数据包处理机制 BPF ...
- Java 多生产者消费者问题
/* 生产者,消费者. 多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行! not ...