线程属性学习

pthread_attr_t :是一个用来设置线程属性的一个数据类型,为一个结构体,里面包含多个线程属性的设置。
线程属性用一个结构体来设置:
typedef struct
{
    int                       detachstate;     线程的分离状态(子线程可以脱离主线程运行,这时子线程到后台运行了)
    int                       schedpolicy;     线程调度策略(SCHED_OTHER 分时调度策略,SCHED_FIFO实时调度策略,先到先服务,SCHED_RR实时调度策略,时间片轮转)
    struct sched_param        schedparam;      线程的调度参数
    int                       inheritsched;    线程的继承性
    int                       scope;           线程的作用域
    size_t                    guardsize;       线程栈末尾的警戒缓冲区大小
    int                       stackaddr_set;   
    void *                    stackaddr;       线程栈的位置
    size_t                    stacksize;       线程栈的大小
}pthread_attr_t;

size_t:unsigned int
说明:SCHED_OTHER 是不支持优先级使用的,而 SCHED_FIFO 和 SCHED_RR 支持优先级的使用,他们分别为199,数值越大优先级越高。//可以看后面代码演示
查看线程默认栈大小:ulimit -s
默认是8M

相关函数学习
一:
用来初始化线程属性函数:int pthread_attr_init(pthread_attr_t *attr)
对所设置的线程对象属性进行回收:int pthread_attr_destroy(pthread_attr_t *attr)


二:
创建的线程栈的大小:int pthread_attr_setstacksize(pthread_attr_t *attr, int scope)
线程所分配的栈大小:int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope)

三:
以下函数分别用来设置和获取线程的作用域:
int pthread_attr_setscope(pthread_attr_t *attr, int scope)
int pthread_attr_getscope(pthread_attr_t *attr, int *scope)

作用域说明:
作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是
PTHREAD_SCOPE_PROCESS(进程内竞争资源)
PTHREAD_SCOPE_SYSTEM (系统级竞争资源)。

四:线程调度参数设置
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param)
int pthread_attr_getschedparam(const  pthread_attr_t *attr, struct sched_param *param)

五:获取/设置线程调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)

六:
设置线程分离属性:detachstate可取的值PTHREAD_CREATE_DETACHED和PTHREAD_CREATE_JOINABLE
pthread_attr_getdetachstate(const pthread_attr_t  *attr, int *detachstate)
pthread_attr_setdetachstate(pthread_attr_t *attr,  int detachstate)

七:设置线程的继承性属性
pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched)
pthread_attr_setinheritsched(const pthread_attr_t *attr, int inheritsched)

inheritsched : 继承性值;具有两个取值
            PTHREAD_INHERIT_SCHED :表示新创建的线程继承父线程的策略
            PTHREAD_EXPLICIT_SCHED:使用设置的策略

代码演示:

#include
#include
#include
 
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_INHERIT_SCHED);
	pthread_attr_getinheritsched(&attr, &policy);
	
	if(policy == PTHREAD_EXPLICIT_SCHED) 
	{
		printf("inherit sched : %d\n", policy); //1
	}
	else if(policy == PTHREAD_INHERIT_SCHED)
	{
		printf("inherit sched : %d\n", policy); //0
	}
	
	//设置/获取调度策略
	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(SCHED_FIFO);
	min_priority = sched_get_priority_min(SCHED_FIFO);
	printf("max_priority : %d\n", max_priority); //99
	printf("min_priority : %d\n", min_priority); //1

    max_priority = sched_get_priority_max(SCHED_RR);
	min_priority = sched_get_priority_min(SCHED_RR);
	printf("max_priority : %d\n", max_priority); //99
	printf("min_priority : %d\n", min_priority); //1
    
    max_priority = sched_get_priority_max(SCHED_OTHER);
	min_priority = sched_get_priority_min(SCHED_OTHER);
	printf("max_priority : %d\n", max_priority); //0
	printf("min_priority : %d\n", min_priority); //0	
}

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

输出结果:
线程属性学习_第1张图片

你可能感兴趣的:(linux环境高级编程)