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]
下面重点介绍对线程属性进行设置的一系列系统函数。
下面给出一个实例说明上述函数的用法。
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 | 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; }
相关文章推荐
- Linux C编程--线程操作线程属性解析
- Linux C编程--线程操作3--线程属性解析
- dom4j解析xml并对节点及属性进行操作
- 线程实用解析---------(四)异步操作
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- JS批量操作CSS属性详细解析
- linux下 线程属性常用操作
- Dom4j解析xml文件-操作节点和属性及写入其他xml文件
- C#中跨线程操作控件 --- InvokeRequired 属性 与Invoke方法
- Linux C编程--线程操作2--线程同步详解
- Linux C编程--线程操作2--线程同步详解
- 用CheckForIllegalCrossThreadCalls 属性解决C#线程间操作无效
- JS批量操作CSS属性详细解析
- JS 操作Array数组的方法及属性实例解析
- Linux C编程--线程操作1--线程概述和简单的线程操作
- Linux C编程--线程操作1--线程概述和简单的线程操作
- Linux c编程:线程属性
- Dom4j解析xml文件-操作节点和属性及写入其他xml文件
- 用CheckForIllegalCrossThreadCalls 属性解决C#线程间操作无效
- JS 操作Array数组的方法及属性实例解析