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