线程属性

  1.     线程属性

                线程属性使用pthread_attr_t结构表示,该结构在被处理前需要对其进行初始化,在使用结束后需要销毁该结构体。可以通过pthread_attr_init()函数进行初始化,pthread_attr_destroy()函数进行销毁

   

名称pthread_attr_init() /  pthread_attr_destroy()
功能对线程属性进行初始化和销毁
头文件#include<pthread.h>
原型

pthread_attr_init(pthread_attr_t  *attr)

pthread_attr_destroy(pthread_attr_t  *attr)

参数Attr线程属性变量
返回0    成功;    -1    失败








调用完pthread_attr_init()函数后,thread_t所表示线程的属性将会用操作系统默认的属性进行初始化

typedef struct 
{
	int		detachstate;线程的分离状态
	int		schedpolicy;线程调度策略
	struct sched_param	schedparam;线程调度参数
	int 	inheritsched;线程继承性
	int 	scope;线程作用域
	size_t	guardsize;线程栈末尾警戒缓冲区大小
	int 	stackaddr_set;
	void*	stackaddr;线程栈位置
	size_t 	stacksize;线程栈大小
}pthread_attr_t;

每个属性都对应了一些函数对其进行查询和修改

2.    线程的分离状态

线程的分离状态决定了线程执行完毕后以什么样的方式终止自己,创建线程时默认是非分离的,在这种情况下原有的线程必须等待创建的线程结束。只有当pthread_join()正确返回时,创建的线程才算终止,所占有的资源被释放

属性为分离状态的线程,不需要原有的线程等待创建的线程结束,当创建的线程结束后,线程自己释放所占有的资源

名称pthread_attr_getdetachstate() / pthread_attr_setdetachstate()
功能   获取线程分离状态 / 设置线程分离状态
头文件   #include<pthread.h>
原型

pthread_attr_getdetachstate(const pthread_attr_t  *attr, int *detachstate)

pthread_attr_setdetachstate(pthread_attr_t *attr,  int detachstate)

参数

attr :    线程属性结构体

detachstate: 分离属性值;具有两个合法值,PTHREAD_CREATE_DETACHED  ; PTHREAD_CREATE_JOINABLE

返回0    成功; -1    失败


 

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

pthread_t pid;
pthread_attr_t attr;

void *child(void *arg)
{
	printf("child is running\n");
}

void main()
{
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	pthread_create(&pid, &attr, child, NULL);
	sleep(2);
	pthread_attr_destroy(&attr);
}


3.    线程继承性

名称pthread_attr_getinheritsched / pthread_attr_setinheritsched
功能获取线程属性的继承性 / 设置线程的继承性
头文件#include<pthread.h>
原型   

pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched)

pthread_attr_setinheritsched(const pthread_attr_t *attr, int inheritsched)

参数

attr :    线程属

inheritsched :  继承性值; 具有两个取值

                    PTHREAD_INHERIT_SCHED :表示新创建的线程继承父线程的策略

                    PTHREAD_EXPLICIT_SCHED:使用设置的策略

返回0    成功 ;     -1      失败  



 

4.    线程调度策略

名称pthread_attr_getschedpolicy / pthread_attr_setschedpolicy
功能获取 / 设置线程调度策略
头文件#include<pthread.h>
原型

pthread_attr_getschedpolicy(pthread_attr_t  *attr, int *schedpolicy)

pthread_attr_setschedpolicy(pthread_attr_t  *attr, int schedpolicy)

参数

attr  :  线程属性结构体

schedpolicy : 调度策略    

取值 : SCHED_FIFO 先进先出;SCHED_RR 轮换; SCHED_OTHER 其他

返回0     成功; -1     失败










5.    线程调度参数

名称pthread_attr_getschedparam / pthread_attr_setschedparam
功能获取 / 设置线程调度参数
头文件#include<pthread.h>
原型

pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param schedparam)

pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param schedparam) 

参数

attr :  线程属性结构体

schedparam : 线程调度参数

返回0     成功; -1     失败


 

#include<stdio.h>
#include<pthread.h>
#include<string.h>

void *child(void *arg)
{
	pthread_attr_t attr;
	int policy;
	int max_priority =0, min_priority = 0;
	
	pthread_attr_init(&attr);
	//设置/获取继承属性
	pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
	pthread_attr_getinheritsched(&attr, &policy);
	
	if(policy == PTHREAD_EXPLICIT_SCHED)
	{
		printf("inherit sched : %d\n", policy);
	}
	else if(policy == PTHREAD_INHERIT_SCHED)
	{
		printf("inherit sched : %d\n", policy);
	}
	
	//设置/获取调度策略
	pthread_attr_setschedpolicy(&attr, SCHED_RR);
	pthread_attr_getschedpolicy(&attr, &policy);
	if(policy == SCHED_RR)
	{
		printf("sched policy : SCHED_RR\n");
	}
	else if(policy == SCHED_FIFO)
	{
		printf("sched policy :SCHED_FIFO\n");
	}
	else{
		printf("sched policy : SCHED_OTHER\n");
	}
	
	//设置/获取调度策略属性
	max_priority = sched_get_priority_max();
	min_priority = sched_get_priority_min();
	printf("max_priority : %d\n", max_priority);
	printf("min_priority : %d\n", min_priority);
	
	param.sched_priority = max_priority;
	pthread_attr_setschedparam(&attr, &param);
	
	
}

void main()
{
	pthread_t pid;
	pthread_create(&pid, NULL, child, NULL);
	pthread_join(pid, NULL);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值