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分配的缓冲区作为线程栈 会在线程结束时自动释放吗
{
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分配的缓冲区作为线程栈 会在线程结束时自动释放吗
相关文章推荐
- 每天一个linux命令(23):Linux 目录结构
- Linux Deepin配置JDK,Eclipse,AndroidStudio
- CentOS yum 源的配置与使用
- Linux 源码系列之可变参数列表实现
- 每天一个linux命令(22):find 命令的参数详解
- Linux监控实战-2
- Linux awk命令
- linux实战(五)----压缩备份文件并删除原文件----实例解析
- linux实战(五)----压缩备份文件并删除原文件----实例解析
- windows和linux服务器互传文件-使用PSCP
- Lab - Install OpenNMS on Kali Linux
- 转:解决centos netstat和ps感染木马
- centos下安装maven
- [转]在CentOS上安装Python
- Linux GCC常用命令
- centos6中安装svn1.8版本
- zabbix Server端在CentOS6.5上的安装过程
- centos设置ssh命令无密码登录
- 查找linux系统下的端口被占用进程的两种方法
- CentOS 6.5 64位下安装MySQL 5.7.11