您的位置:首页 > 运维架构 > Linux

linux 线程 线程属性

2016-02-14 18:15 609 查看
typedef struct

{

int etachstate; //线程的分离状态

int schedpolicy; //线程调度策略

structsched_param schedparam; //线程的调度参数

int inheritsched; //线程的继承性

int scope; //线程的作用域

size_t guardsize; //线程栈末尾的警戒缓冲区大小

int stackaddr_set; //线程的栈设置

void* stackaddr; //线程栈的位置

size_t stacksize; //线程栈的大小
}pthread_attr_t;

这个结构只是为了说明  实际结构具体系统而定  虽然如此我们并不用担心因为

属性值不能直接设置,须使用相关函数进行操作

int pthread_attr_init(pthread_attr_t *attr); //初始化线程属性

int pthread_attr_destroy(pthread_attr_t *attr); //销毁线程属性所占用的资源

1>线程的分离态

        非分离状态:线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程

结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统

资源。

        分离状态:分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马

上释放系统资源。应该根据自己的需要,选择适当的分离状态。pthread_join()接收分离态

线程返回出错。

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); //设置线程属性,分离or非分



int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate); //获取程属性,分离or非分离

pthread_attr_t *attr:被已初始化的线程属性

int *detachstate:可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)

注意:如果是分离态那么有可能  pthread_create返回之前就已经执行完毕  那么pthread_create返回的tip可能是无效的

那就必须设置适当的线程同步

2>设置栈大小

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

attr 指向一个线程属性的指针

stacksize 返回线程的堆栈大小

返回值:若是成功返回0,否则返回错误的编号

        当进程栈地址空间不够用时,指定新建线程使用由malloc分配的空间作为自己的栈空

间。通过pthread_attr_setstackaddr和pthread_attr_getstackaddr两个函数分别设置和获

取线程的栈地址。传给pthread_attr_setstackaddr函数的地址是缓冲区的低地址(不一定

是栈的开始地址,栈可能从高地址往低地址增长)。

#include <pthread.h>

int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);

int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);

attr: 指向一个线程属性的指针

stackaddr: 返回获取的栈地址

返回值:若是成功返回0,否则返回错误的编号

说 明:函数已过时,一般用下面的新API代替

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);

attr 指向一个线程属性的指针

stackaddr 返回获取的栈地址

stacksize 返回获取的栈大小

返回值:若是成功返回0,否则返回错误的编号

还可以用这组函数设置栈大小

#include <pthread.h>

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

attr 指向一个线程属性的指针

stacksize 返回线程的堆栈大小

返回值:若是成功返回0,否则返回错误的编号

//redhat6.0  普通用户单个进程的线程数貌似收到了限制  最大只开到1021个  root下无限制

//未解决  malloc分配的缓冲区作为线程栈  会在线程结束时自动释放吗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: