数据类型: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的更多相关文章

  1. 线程属性总结 线程的api属性

    http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程 ...

  2. 线程池 API (转)

    文档原始地址    目录 线程池概述 线程池对象 回调环境对象 工作对象 等待对象 计时器对象 I/O 完成对象 使用清理组简化清理 回调实例 API    随着 Windows Vista® 的发布 ...

  3. APUE学习之多线程编程(三):线程属性、同步属性

    一.线程属性      可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ...

  4. 线程属性pthread_attr_t

    转:http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html1.    线程属性:             使用pthread_attr_t类型表示,我 ...

  5. 线程操作API

    线程操作API 1.currentThread 2.getId() .getName().getPriority().getStart.isAlive().isDaemon().isInterrupt ...

  6. pthread_attr_t 线程属性(二)

    一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthrea ...

  7. pthread_attr_t 线程属性(一)

    1.    线程属性:             使用pthread_attr_t类型表示,我们需要对此结构体进行初始化,                 初始化后使用,使用后还要进行去除初始化!    ...

  8. Linux 线程属性函数总结

    1.初始化一个线程对象的属性 int pthread_attr_init(pthread_attr_t *attr); 返回值:若是成功返回0,否则返回错误的编号 形 参: attr 指向一个线程属性 ...

  9. Linux线程属性总结

    线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. //线程属性结构如下: typedef struct { int                   etachs ...

随机推荐

  1. 使用git-premit时的问题

    package.json 相关配置如下 { "scripts": { "lint": "eslint pages/* component/* --fi ...

  2. 如何在静态方法或非Spring Bean中注入Spring Bean

           在项目中有时需要根据需要在自己new一个对象,或者在某些util方法或属性中获取Spring Bean对象,从而完成某些工作,但是由于自己new的对象和util方法并不是受Spring所 ...

  3. 第十三次作业psp

    psp 进度条 代码累积折线图 博文累积折线图 psp饼状图

  4. 王者荣耀交流协会final发布第五次scrum例会

    1.例会照片 成员高远博,冉华,王磊,王玉玲,任思佳,袁玥,王磊,王超. master:王磊 2.时间跨度 2017年12月5日 18:00 — 18:21,总计21分钟 3.地点 一食堂二楼沙发座椅 ...

  5. HDU 4514 湫湫系列故事——设计风景线 树的直径

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4514 湫湫系列故事--设计风景线 Time Limit: 5000/2000 MS (Java/Ot ...

  6. 【图论】POJ-3169 差分约束系统

    一.题目 Description Like everyone else, cows like to stand close to their friends when queuing for feed ...

  7. What is ASP.NET SignalR

    什么是ASP.NET SignalR ASP.NET SignalR是ASP.NET开发人员的新库,它使得为应用程序添加实时Web功能变得非常简单. 什么是“实时网络”功能?它能够让您的服务器端代码实 ...

  8. Java面试& HashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端.  数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O( ...

  9. JAVA中处理事务的程序--多条更新SQL语句的执行(包括回滚)

    在与数据库操作时,如果执行多条更新的SQL语句(如:update或insert语句),在执行第一条后如果出现异常或电脑断电, 则后面的SQL语句执行不了,这时候设定我们自己提交SQL语句,不让JDBC ...

  10. Spring框架的补充

    1.使用xml文件方式配置bean ——property标签ref属性和ref标签区别 <property name=“bean” ref="myBbean" /> r ...