您的位置:首页 > 运维架构 > Linux

Linux C编程--线程操作3--线程属性解析

2013-03-06 18:36 239 查看
线程属性结构如下:

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;

属性的缺省值如下:


[thead]
[/thead]

属性


结果
scope
PTHREAD_SCOPE_PROCESS
新线程与进程中的其他线程发生竞争。
detachstate
PTHREAD_CREATE_JOINABLE
线程退出后,保留完成状态和线程 ID。
stackaddr
NULL
新线程具有系统分配的栈地址。
stacksize
0
新线程具有系统定义的栈大小。
priority
0
新线程的优先级为 0。
inheritsched
PTHREAD_EXPLICIT_SCHED
新线程不继承父线程调度优先级。
schedpolicy
SCHED_OTHER
新线程对同步对象争用使用 Solaris 定义的固定优先级。线程将一直运行,直到被抢占或者直到线程阻塞或停止为止
下面重点介绍对线程属性进行设置的一系列系统函数。



1、初始化一个线程对象的属性
int pthread_attr_init(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
    说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
            pthread_attr_init实现时为属性对象分配了动态内存空间。
    头文件:#include <pthread.h>


2、销毁一个线程属性对象
int pthread_attr_destroy(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
    说  明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。
    头文件:#include <pthread.h>


3、获取线程堆栈大小
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stacksize  返回线程的堆栈大小
    说  明:获取线程堆栈大小
    头文件:#include <pthread.h>


4、设置线程堆栈大小

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  线程的栈保护区大小:应该是页大小的整数倍
    说  明:设置线程堆栈大小:
    头文件:#include <pthread.h>


5、获取线程堆栈地址
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  返回获取的栈地址
    说  明:函数已过时,一般用pthread_attr_getstack来代替
    头文件:#include <pthread.h>


6、设置线程堆栈地址
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            stackaddr  设置线程堆栈地址
    说  明:函数已过时,一般用pthread_attr_setstack来代替
    头文件:#include <pthread.h>


7、获取线程分离状态属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr          指向一个线程属性的指针
            detachstate   保存返回的分离状态属性
    说  明:获取线程分离状态属性
    头文件:#include <pthread.h>


8、修改线程分离状态属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr        指向一个线程属性的指针
            detachstat  有两个取值
                        PTHREAD_CREATE_DETACHED(分离)
                        PTHREAD_CREATE_JOINABLE(非分离)
    说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
    头文件:#include <pthread.h>


9、获取线程的作用域
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            scope      返回线程的作用域
    说  明:指定了作用域也就指定了线程与谁竞争资源
    头文件:#include <pthread.h>


10、设置线程的作用域
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  线程的作用域,可以取如下值
                       PTHREAD_SCOPE_SYSTEM    与系统中所有进程中线程竞争
                       PTHREAD_SCOPE_PROCESS   与当前进程中的其他线程竞争
    说  明:指定了作用域也就指定了线程与谁竞争资源
    头文件:#include <pthread.h>


11、获取线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr          指向一个线程属性的指针
            inheritsched  返回继承调度属性的设置
    说  明:获取线程是否继承调度属性
    头文件:#include <pthread.h>


12、设置线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            guardsize  设置线程是否继承调度属性
                        PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程
                                               attr中的设置将被忽略
                        PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性值
    说  明:
    头文件:#include <pthread.h>


13、获取线程的调度策略
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            policy     返回线程的调度策略
    说  明:获取线程的调度策略
    头文件:#include <pthread.h>


14、设置线程的调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            policy     线程的调度策略,有如下三种:
                        SCHED_FIFO    先入先出策略
                        SCHED_RR      轮转调度,类似于 FIFO,但加上了时间轮片算法
                        SCHED_OTHER      系统默认策略
    说  明:设置线程的调度策略
    头文件:#include <pthread.h>


15、获取线程的调度参数
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            param      返回获取的调度参数,该结构仅有一个从参数,如下
                        struct sched_param 
                        {
                            int sched_priority; /* Scheduling priority */
                        };
    说  明:获取线程的调度参数
    头文件:#include <pthread.h>


16、设置线程的调度参数
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:
            attr       指向一个线程属性的指针
            param      要设置的调度参数
    说  明:设置线程的调度参数
    头文件:#include <pthread.h>


下面给出一个实例说明上述函数的用法。



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

void *my_thread(void *arg)
{
	int retval=0;
	pthread_attr_t attr;   //线程属性对象
	struct sched_param param;   //线程调度参数的结构
	size_t	stacksize;   //线程堆栈大小
	int		detachstate;   //线程拆卸状态
	int		scope;    //线程作用域
	int		inherit;   //线程继承状态
	int		policy;    //线程调度策略
	
	//线程属性对象的初始化
	if(pthread_attr_init(&attr)==0)
	{
		//获取线程堆栈的大小
		if(pthread_attr_getstacksize(&attr,&stacksize)==0)
		{
			printf("StackSize: %d\n",stacksize);
		}
		//获取线程的拆卸状态
		if(pthread_attr_getdetachstate(&attr, &detachstate)==0)
		{
			if(detachstate==PTHREAD_CREATE_JOINABLE)
				printf("DetachState :PTHREAD_CREATE_JOINABLE\n");
			if(detachstate==PTHREAD_CREATE_DETACHED)
				printf("DetachState :PTHREAD_CREATE_DETACHED\n");
		}
		//获取线程的作用域
		if(pthread_attr_getscope(&attr, &scope)==0)
		{
			if(scope==PTHREAD_SCOPE_PROCESS)
				printf("Scope :PTHREAD_SCOPE_PROCESS\n");
			if(detachstate==PTHREAD_SCOPE_SYSTEM)
				printf("Scopee :PTHREAD_SCOPE_SYSTEM\n");
		}
		//获取线程的继承调度策略
		if(pthread_attr_getinheritsched(&attr, &inherit)==0)
		{
			if(inherit==PTHREAD_INHERIT_SCHED)
				printf("InheritSched:PTHREAD_INHERIT_SCHED\n");
			if(inherit==PTHREAD_EXPLICIT_SCHED)
				printf("InheritSched:PTHREAD_EXPLICIT_SCHED\n");
		}
		//获取线程的调度策略
		if(pthread_attr_getschedpolicy(&attr, &policy)==0)
		{
			if(policy==SCHED_FIFO)
				printf("SchedPolicy:SCHED_FIFO\n");
			if(policy==SCHED_RR)
				printf("SchedPolicy:SCHED_RR\n");
			else
				printf("SchedPolicy:SCHED_OTHER\n");
		}
		//线程的调度参数
		if(pthread_attr_getschedparam(&attr, ¶m)==0)
		{
			printf("SchedPriority:%d\n",param.sched_priority);
		}
		pthread_attr_destroy(&attr);
	}
	pthread_exit(&retval);
}

int main()
{
	pthread_t	thread;
	int			*retval;
	if(pthread_create(&thread,NULL,my_thread,(void *)NULL)!=0)
	{
		printf("Count not create thread! \n");
		return -1;
	}
	if(pthread_join(thread,(void **)(&retval))!=0)
	{
		printf("No thread to join! \n");
		return -2;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: