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

来源:互联网 发布:php求数组中的最大值 编辑:程序博客网 时间:2024/05/02 00:13
线程属性结构如下:

                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;

属性的缺省值如下:

属性

结果

scope

PTHREAD_SCOPE_PROCESS

新线程与进程中的其他线程发生竞争。 

detachstate

PTHREAD_CREATE_JOINABLE

线程退出后,保留完成状态和线程 ID

stackaddr

NULL

新线程具有系统分配的栈地址。 

stacksize

新线程具有系统定义的栈大小。 

priority

新线程的优先级为 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_tstacksize;   //线程堆栈大小intdetachstate;   //线程拆卸状态intscope;    //线程作用域intinherit;   //线程继承状态intpolicy;    //线程调度策略//线程属性对象的初始化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");elseprintf("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_tthread;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;}


原创粉丝点击