Linux创建线程的属性设置

来源:互联网 发布:javascript 创建对象 编辑:程序博客网 时间:2024/06/05 16:27
如果线程调用函数:sleep()函数,就是挂起自己,线程挂起,此时CPU的时间片就会分配给其他进程。而如果当前线程自己轮询操作,就会一直使用系统分配给自己的时间片。
对于一个系统而言:系统会分配给线程时间片,同时系统执行调度程序也会花费时间,称为调度时间。


创建线程时的属性设置

1. 线程的调度策略:
SCHED_OTHREAD 非实时调度策略。线程优先级为0,每个线程都不抢占其他的线程。线程会受到时间片的限制。会一直占用系统分配给他的时间片。
SCHED_RR 实时调度策略。线程优先级1-99,数值越大,优先级越高。系统分配给一个线程一个时间片,这个时间片运行过程中不会被打断。但是当时间片运行结束,下一个时间片会分给优先级更高的线程。
SCHED_FIFO 实时调度策略。线程优先级1-99,数值越大,优先级越高。时间片首先分配给优先级最高的线程。一旦时间片分配给一个线程,除非线程主动挂起和退出,该线程会一直占用CPU。线程按照不同的优先级有不同的线程队列。在一个队列中先进先出。
=>实时调度策略会抢占非实时调度策略。除非非实时的线程运行结束,否则实时的线程是不可能得到运行的。
  一个进程里面可能有多种调度策略的线程。
pthread_attr_t attr;
struct sched_param param;
param._sched_prority = 10;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR/SCHED_FIFO);
pthread_attr_setschedparam(&attr, &param);
pthread_create(xxx, &attr, xxx, xxx);
pthread_attr_destroy(&attr);


2. 线程优先级的作用范围:
PTHREAD_SCOPE_SYSTEM 线程的优先级的作用范围是整个系统。即线程和系统中所有的线程竞争CPU的时间。
PTHREAD_SCOPE_PROCESS 线程的优先级的作用氛围是当前进程。即线程和该进程中其他线程竞争CPU时间。
pthread_attr_t attr;
struct sched_param param;
param._sched_prority = 10;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR/SCHED_FIFO);
pthread_attr_setschedparam(&attr, &param);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM/PTHREAD_SCOPE_PROCESS);
pthread_create(xxx, &attr, xxx, xxx);
pthread_destroy(&attr);


3. 线程和其他线程是否分家:
PTHREAD_CREATE_DETACHED 新线程不能用pthread_join函数来同步,而且在退出时自行释放所占用的资源。
PTHREAD_CREATGE_JOINABLE 默认值。可以使用pthread_detach(pthread_id)改变分家状态。
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);


4. 线程栈的大小:
栈是线程的属性,在创建线程的时候,可以指定栈的大小。但是程序运行的过程中,栈的大小不能改变。即线程创建出来,大小就确定。
int stack_size;
pthread_attr_setstacksize(&attr, stack_size);
pthread_attr_getstacksize(&attr, &stack_size);
PTHREAD_STACK_MIN 栈的最小值


以上函数原型:
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);

int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);


线程的栈和进程的堆:
栈是系统自动分配,效率比堆高。(管理堆需要做更多的事,而且据说栈通常会放到告诉缓存中)
堆的大小比栈大的多,大小受限于系统有效虚拟内存空间。一个进程的堆的大小不是固定的?是当前申请的堆内存的大小。
全局数据区的大小有系统限制,一般比较大。是固定的?
原创粉丝点击