linux 线程 线程属性

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分配的缓冲区作为线程栈  会在线程结束时自动释放吗








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值