一.线程属性
线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。
1.名称:pthread_attr_init/pthread_attr_destroy
功能:对线程属性初始化/去除初始化
头文件:#include <pthread.h>
函数原形:int pthread_attr_init(pthread_attr_t *attr);
参数:Attr 线程属性变量
返回值:若成功返回0,若失败返回-1。
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_attr_getdetachstate/pthread_attr_setdetachstate
功能:获取/修改线程的分离状态属性
头文件:#include <pthread.h>
函数原形:int pthread_attr_getdetachstate(const pthread_attr_t *
attr,int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr,int
detachstate);
参数:Attr 线程属性变量, Detachstate 线程的分离状态属性
返回值:若成功返回0,若失败返回-1。
(1) 以分离状态创建线程
#include <pthread.h>
void *child_thread(void *arg)
{
printf(“child thread run!\n”);
}
int main(int argc,char *argv[ ])
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_create(&tid,&attr,fn,arg);
pthread_attr_destroy(&attr);
sleep(1);
}
三、线程的继承性
3.名称:pthread_attr_getinheritsched
/pthread_attr_setinheritsched
功能:获得/设置线程的继承性
头文件:#include <pthread.h>
函数原形:int pthread_attr_getinheritsched(const pthread_attr_t
*attr,int *inheritsched);
参数:attr 线程属性变量, inheritsched 线程的继承性
返回值:若成功返回0,若失败返回-1。
四、线程的调度策略
4.名称:pthread_attr_getschedpolicy \pthread_attr_setschedpolicy
功能:获得/设置线程的调度策略
头文件:#include <pthread.h>
函数原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int
*policy);
参数:attr 线程属性变量, policy 调度策略
返回值:若成功返回0,若失败返回-1。
五、线程的调度参数
5.名称:pthread_attr_getschedparam \pthread_attr_setschedparam
功能:获得/设置线程的调度参数
头文件:#include <pthread.h>
函数原形:int pthread_attr_getschedparam(const pthread_attr_t
*attr,struct sched_param *param);
int pthread_attr_setschedparam(pthread_attr_t *attr,const struct
sched_param *param);
参数:attr 线程属性变量, param sched_param结构
返回值:若成功返回0,若失败返回-1。
struct sched_param
{
int sched_priority;
};
注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。
6.名称:sched_get_priority_max \sched_get_priority_min
功能:获得系统支持的线程优先权的最大和最小值
头文件:#include <pthread.h>
函数原形:int sched_get_priority_max(int policy); int
sched_get_priority_min(int policy);
参数:policy 系统支持的线程优先权的最大和最小值
返回值:若成功返回0,若失败返回-1。
#include <pthread.h>
#include <sched.h>
void *child_thread(void *arg)
{
int policy;
int max_priority,min_priority;
struct sched_param param;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
pthread_attr_getinheritsched(&attr,&policy);
if(policy==PTHREAD_EXPLICIT_SCHED)
printf(“Inheritsched:PTHREAD_EXPLICIT_SCHED\n”);
if(policy==PTHREAD_INHERIT_SCHED)
printf(“Inheritsched:PTHREAD_INHERIT_SCHED\n”);
pthread_attr_setschedpolicy(&attr,SCHED_RR);
pthread_attr_getschedpolicy(&attr,&policy);
if(policy==SCHED_FIFO)
printf(“Schedpolicy:SCHED_FIFO\n”);
if(policy==SCHED_RR)
printf(“Schedpolicy:SCHED_RR\n”);
if(policy==SCHED_OTHER)
printf(“Schedpolicy:SCHED_OTHER\n”);
sched_get_priority_max(max_priority);
sched_get_priority_min(min_priority);
printf(“Max priority:%u\n”,max_priority);
printf(“Min priority:%u\n”,min_priority);
param.sched_priority=max_priority;
pthread_attr_setschedparam(&attr,¶m);
printf(“sched_priority:%u\n”,param.sched_priority);
pthread_attr_destroy(&attr);
}
int main(int argc,char *argv[ ])
{
pthread_t child_thread_id;
pthread_create(&child_thread_id,NULL,child_thread,NULL);
pthread_join(child_thread_id,NULL);
}
六、线程的作用域
7.名称:pthread_attr_setscope\pthread_attr_getscope
功能:获得/设置线程的作用域
头文件:#include <pthread.h>
函数原形:int pthread_attr_setscope(pthread_attr_t *attr,int
scope);
int pthread_attr_getscope(const pthread_attr_t *attr,int
*scope);
参数:attr 线程属性变量, scope 线程的作用域
返回值:若成功返回0,若失败返回-1。
七、线程堆栈的大小
8.名称:pthread_attr_getdetstacksize\pthread_attr_setstacksize
功能:获得/修改线程栈的大小
头文件:#include <pthread.h>
函数原形:int pthread_attr_getstacksize(const pthread_attr_t *restrict
attr,size_t *restrict stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t
*stacksize);
参数:attr 线程属性变量,stacksize 堆栈大小
返回值:若成功返回0,若失败返回-1。
八、线程堆栈的地址
函数pthread_attr_setstackaddr和pthread_attr_getstackaddr分别用来设置和得到线程堆栈的位置,这两个函数的定义如下:
9.名称:pthread_attr_setstackaddr\pthread_attr_getstackaddr
功能:获得/修改线程栈的位置
头文件:#include <pthread.h>
函数原形:int pthread_attr_getstackaddr(const pthread_attr_t *attr,void
**stackaddf);
int pthread_attr_setstackaddr(pthread_attr_t *attr,void
*stackaddr);
参数:attr 线程属性变量,stackaddr 堆栈地址
返回值:若成功返回0,若失败返回-1。
这两个函数具有两个参数,第1个是指向属性对象的指针,第2个是堆栈地址或指向堆栈地址的指针。
九、线程栈末尾的警戒缓冲区大小
函数pthread_attr_getguardsize和pthread_attr_setguardsize分别用来设置和得到线程栈末尾的警戒缓冲区大小,这两个函数的定义如下:
10.名称:pthread_attr_getguardsize/pthread_attr_setguardsize
功能:获得/修改线程栈末尾的警戒缓冲区大小
头文件:#include <pthread.h>
函数原形:int pthread_attr_getguardsize(const pthread_attr_t *restrict
attr,size_t *restrict guardsize);
int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t
*guardsize);
参数:
返回值:若成功返回0,若失败返回-1。
本文详细介绍了线程的各种属性,包括线程属性初始化、分离状态、继承性、调度策略及参数、作用域、堆栈大小与位置等内容,并提供了相关函数的使用示例。
4779

被折叠的 条评论
为什么被折叠?



