
6.7.3 设置线程调度和优先级
齐宁/董泽惠 译 清华大学出版社 2010-06-22
6.7.3 设置线程调度和优先级
线程是独立执行的。它们被分派到处理器内核上,并执行分给它们的任务。每个线程均有一个调度策略和优先级,决定何时以及如何分配到处理器上pthread 设置优先级。线程或线程组的调度策略可以使用这些函数通过属性对象来设置:
调用形式
- #include <pthread.h>
- #include <sched.h>
- int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
- void pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
- int pthread_attr_setschedparam(pthread_attr_t *restrict attr,
- const struct sched_param *restrict param);
pthread_attr_setinheritesched( )用于确定如何设置线程的调度属性,可以从创建者线程或从一个属性对象来继承调度属性。inheritsched可以为如下值。
PTHREAD_INHERIT_SCHED:线程调度属性是从创建者线程继承得到,attr的任何调度属性都被忽略。
PTHREAD_EXPLICIT_SCHED:线程调度属性设置为属性对象attr的调度属性pthread 设置优先级。
函数pthread_attr_getschedparam 和pthread_attr_setschedparam分别用来设置和得到线程的调度参数。如:根据服务区分策略,根据优先级区分策略,流量均衡策略,拥塞预防策略,根据ip precedene排列报文发送顺序优先发送报文策略,降低mtu值策略。对于优先b级证券,通常设置优先收购权人支付较高的权利维持费(注:按票面价格或约定价格回购优先b级证券相当于一个对优先b级证券的看涨期权,权利维持费相当于期权费),使其具有较强的提前收购意愿,进而给予优先b级证券投资人很强的产品将被按时回购的预期。
pthread_attr_setschedpolicy( )设置线程属性对象attr的调度策略。policy的值可以为在<sched.h>头文件中定义的以下值。
SCHED_FIFO:先进先出调度策略,执行线程运行到结束。
SCHED_RR:轮询调度策略,按照时间片将每个线程分配到处理器上。

SCHED_OTHER:另外的调度策略(根据实现定义)。这是任何新创建线程的默认调度策略。
参数pvparam必须指向包含新参数的 iconmetrics结构,另外还要将参数ulparam和该结构中的cbsize成员的值设置为sizeof (iconmetrics)。参数pvparam必须指向包含新参数 的filterkeys结构,该结构中的cbsize成员和参数ulparam的值应设为sizeof。在对话框中使用控件(control),首先应该熟悉控件的两种定义方式,虽然有时候用不到自己去编写资源脚本,但是控件在定义的时候有许多参数需要根据实际情况附加,我在编写资源脚本的时候,用resedit软件编写的时候,当我定义好一些类型属性,去预览代码的时候,好多属性参数和用其他工具编写的属性参数有的是不一样的,当你把在resedit上编写的资源脚本代码粘贴到radasm里面的工程中的资源文件里的时候,总会出现一些错误,这两个软件的有些内容好像有些许的差距,在用resedit编写的时候有一些参数在radasm里面识别不了,比如。
- struct sched_param {
- int sched_priority;
- //...
- };
装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申明完成的时候被调用,调用之后返回一个修改之后的函数对象,将其重新赋值。其中函数mcisendstring还有三个参数,lpstrreturnstring是一个字符串,它用来接收 mcisendstring函数返回的信息(例如,我们在lpstrcommand中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在这个参数中。waitforsingleobject函数用来检测 hhandle事件的信号状态,当函数的执行时间超过dwmilliseconds就返回,但如果参数dwmilliseconds为infinite时 函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到waitforsingleobject有返回直才执行后面的代码。
按照如下方法使用sched_get_priority_max( )和sched_get_priority_max( ),可以得到优先级的最大值和最小值。
调用形式
- #include <sched.h>
- int sched_get_priority_max(int policy);
- int sched_get_priority_min(int policy);
该参数与 g 代码要相对应如下: 工件坐标系 1 (g54) ---工件原点返回偏移值---参数 1221 工件坐标系 2 (g55) ---工件原点返回偏移值---参数 1222 工件坐标系 3 (g56) ---工件原点返回偏移值---参数 1223 工件坐标系 4 (g57) ---工件原点返回偏移值---参数 1224 工件坐标系 5 (g58) ---工件原点返回偏移值---参数 1225 工件坐标系 6 (g59) ---工件原点返回偏移值---参数 1226 在接通电源和完成了原点返回后,系统自动选择工件坐标系 1 (g54) 。判断参数是否为文本1983获取信息与转换数值函数1991应用cell函数计算并显示单元格的信息1992应用error.type函数判断错误的类型2023应用info函数计算有关当前操作环境的信息2034应用n函数计算转化为数值后的值2045应用na函数计算错误值#n/a2066应用type函数计算数值类型2067应用sheet函数返回引用工作表的工作表编号2078应用sheets函数返回引用中的工。or函数判断参数是否为错误值1913应用iseven函数判断数值是否为偶数1924应用islogical函数判断参数是否为逻辑值1935应用isna函数判断错误值是否为#n/a1946应用isnontext函数判断参数是否为非字符串1957应用isnumber函数判断参数是否为数字1968应用isodd函数判断数值是否为奇数1979应用isref函数判断参数是否为引用19810应用istext函数。
示例6-10显示了如何使用线程属性对象设置线程的调度策略和优先级。
示例6-10
- // Example 6-10 Using the thread attribute object to set scheduling
- // policy and priority of a thread.
- #include <pthread.h>
- #include <sched.h>
- //...
- pthread_t ThreadA;
- pthread_attr_t SchedAttr;
- sched_param SchedParam;
- int MidPriority,MaxPriority,MinPriority;
- int main(int argc, char *argv[])
- {
- //...
- // Step 1: initialize attribute object
- pthread_attr_init(&SchedAttr);
- // Step 2: retrieve min and max priority values for scheduling policy
- MinPriority = sched_get_priority_max(SCHED_RR);
- MaxPriority = sched_get_priority_min(SCHED_RR);
- // Step 3: calculate priority value
- MidPriority = (MaxPriority + MinPriority)/2;
- // Step 4: assign priority value to sched_param structure
- SchedParam.sched_priority = MidPriority;
- // Step 5: set attribute object with scheduling parameter
- pthread_attr_setschedparam(&SchedAttr,&SchedParam);
- // Step 6: set scheduling attributes to be determined by attribute object
- pthread_attr_setinheritsched(&SchedAttr,PTHREAD_EXPLICIT_SCHED);
- // Step 7: set scheduling policy
- pthread_attr_setschedpolicy(&SchedAttr,SCHED_RR);
- // Step 8: create thread with scheduling attribute object
- pthread_create(&ThreadA,&SchedAttr,task1,NULL);
- //...
- }
调度方面:在引入线程的os中,线程是独立的调度和分派单位,而进程作为资源的拥有单位(相当于把未引入线程的传统os中的进程的两个属性分开了)。brian goetz对线程安全比较恰当的定义:当多个线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调度方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。为了区别是否是创建控件的线程访问该控件,windows应用程序中每一个控件对象都有一个invokerequired属性,用来检查是否需要通过调用invoke方法完成其他线程对该控件的操作,如果该属性为true.说明是其他线程操作该控件,这时可以创建一个委托实例,然后调用控件对象的invoke方法,并传入需要的参数完成相应操作,否则可以直接对该控件对象进行操作,从而保证了其他线程安全操作本线程中的控件.。
(1) 初始化属性对象

(2) 为调度策略提取最大和最小优先级值
(3) 计算优先级值
(4) 将优先级值赋给sched_param结构体
(5) 使用调度参数设置属性对象
(6) 将调度属性设置为由属性对象决定
(7) 设置调度策略
(8) 使用调度属性对象创建一个线程
在示例6-10中,我们将优先级设置为一个平均值。但是优先级可以设置为介于线程调度策略所允许的最大和最小优先级值之间的任何值。有了这些方法,调度策略和优先级可以程被创建或运行之前,先设置程属性对象中。为了动态改变调度策略和优先级,可以使用pthread_setschedparam( )和pthread_setschedprio( )。
调用形式
- #include <pthread.h>
- int pthread_setschedparam(pthread_t thread, int policy,
- const struct sched_param *param);
- int pthread_getschedparam(pthread_t thread, int *restrict policy,
- struct sched_param *restrict param);
- int pthread_setschedprio(pthread_t thread, int prio);
pthread_setschedparam( )不需要使用属性对象即可直接设置线程的调度策略和优先级。thread是线程的id,policy是新的调度策略,param包含调度优先级。如果成功,则pthread_getschedparam( )返回调度策略和调度参数,并将它们的值分别保存在policy和param参数中。如果成功,则两个函数都返回0。如果不成功,两个函数都返回错误号。表6-7列出了这些函数可能失败的条件。
pthread_setschedprio( )用来设置正在执行中的线程的调度优先级,该进程的id由thread指定。prio指定了线程的新调度优先级。如果函数失败,线程的优先级不发生变化,返回一个错误号。如果成功,则函数返回0。表6-7也列出了这个函数可能失败的条件。
表6-7

int pthread_getschedparam
(pthread_t thread,
int *restrict policy, struct
sched_param *restrict param);
thread参数所指向的线程不存在
int pthread_setschedparam
(pthread_t thread,
int *policy, const
struct sched_param *param);
参数policy或同参数policy
关联的调度参数之一无效;
参数policy或调度参数之一的值不被支持;
调用线程没有适当的权限来设

置指定线程的调度参数或策略;
参数thread指向的线程不存在;
实现不允许应用程序将参数
改动为特定的值
int pthread_setschedprio
(pthread_t thread, int prio);
参数prio对于指定线程的调度策略无效;
参数prio的值不被支持;
调用线程没有适当的权限来设
置指定线程的调度优先级;
参数thread指向的线程不存在;
实现不允许应用程序将优先
级改变为指定的值
注意:
已实现的调度程序有:基于优先级的抢占式调度和edf调度。基于优先级抢占式调度(pbp,priority based and preemptive):系统中每个任务都有一个优 先级,内核总是将cpu分配给处于就绪态的优先级最高的任务运行。ecos支持优先级的抢占式调度和轮转调度相结合的mlq(multi level queue)调度器,基于优先级的抢占式调度的bitmap位图调度器,lottery抽签调度器,三种调度器只是在cyg_scheduler_implementation类的定义上有所区别。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-102727-1.html
这才是真正需要注意的地方
干掉他
恒大淘宝2
但你怎么会知道