By:Ailson Jack
Date:2016.04.04
个人博客:www.only2fire.com
本文在我博客的地址是:http://www.only2fire.com/archives/60.html,排版更好,便于学习。
最近在学习Linux的编程,这里在博客中记录一下学习的过程。
对于线程的优先级设定,在网上也看了不少的文章,大多数都只介绍了一个线程,关键是介绍的例程,设置的线程优先级都不起作用。由于之前接触的Linux编程知识比较少,这个问题困扰了我一晚上。于是接着在网上看资料,终于能够使线程的优先级设置有效。
1、相关知识介绍
首先总结一下,线程优先级设置的条件:
a、线程的调度策略必须为:SCHED_RR或SCHED_FIFO;
b、线程的继承策略必须为:PTHREAD_EXPLICIT_SCHED
对于继承策略,这里举个简单的例子:
如果线程A创建了线程B,则线程B的调度策略与线程A的调度策略和线程B的继承策略有关的:
如果线程B继承策略为PTHREAD_INHERIT_SCHED,则线程B的调度策略与线程A相同,线程B的优先级也与线程A相同,但是线程B不能够自己修改调度策略与优先级(个人理解,不对请指教);
如果线程B继承策略为PTHREAD_EXPLICIT_SCHED,则线程B的调度策略由线程属性attr决定,可以自行设置调度策略与优先级。
其中继承策略必须为PTHREAD_EXPLICIT_SCHED,否则设置线程的优先级会被忽略。
2、程序示例:
下面是一个简单的设置优先级的程序示例,通过修改任务1与任务2的优先级高低,可以观察到打印信息中,先打印的是优先级高的任务的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | /* ******************************************************************************** *描述:设置线程优先级 *Use:gcc prio.c -lpthread *By:Ailson Jack *Date:2016.03.25 *Blog:www.only2fire.com ******************************************************************************** */
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <time.h>
//在用户层或者应用层,1表示优先级最低,99表示优先级最高 #define Task1_Prio 6 #define Task2_Prio 7
pthread_barrier_t barrier;
void *Task1(void *arg); void *Task2(void *arg);
int main(void) { int policy,inher; pthread_t tid; pthread_attr_t attr; struct sched_param param; pthread_barrier_init(&barrier,NULL,2+1);
//初始化线程属性 pthread_attr_init(&attr); //获取继承的调度策略 pthread_attr_getinheritsched(&attr,&inher);
if(inher == PTHREAD_EXPLICIT_SCHED) printf("PTHREAD_EXPLICIT_SCHED\r\n"); else if(inher == PTHREAD_INHERIT_SCHED) { printf("PTHREAD_INHERIT_SCHED\r\n"); //必需设置inher的属性为 PTHREAD_EXPLICIT_SCHED,否则设置线程的优先级会被忽略 inher = PTHREAD_EXPLICIT_SCHED; }
//设置继承的调度策略 //具有root权限的用户才能执行pthread_attr_setinheritsched操作, //否则创建线程会失败 pthread_attr_setinheritsched(&attr,inher); //设置线程调度策略 policy = SCHED_FIFO; pthread_attr_setschedpolicy(&attr,policy); //设置调度参数 param.sched_priority = Task1_Prio; pthread_attr_setschedparam(&attr,¶m); //创建线程 pthread_create(&tid, &attr,Task1,NULL);
//设置调度参数 param.sched_priority = Task2_Prio; pthread_attr_setschedparam(&attr,¶m); //创建线程 pthread_create(&tid, &attr,Task2,NULL); sleep(1); pthread_barrier_wait(&barrier); pthread_join(tid, NULL); }
void *Task1(void *arg) { pthread_barrier_wait(&barrier); while(1) { printf("Task1 is running.\r\n"); sleep(3);//延时3s } pthread_exit(NULL); }
void *Task2(void *arg) { pthread_barrier_wait(&barrier); while(1) { printf("Task2 is running.\r\n"); sleep(3);//延时3s } pthread_exit(NULL); } |
编译运行程序,由于任务2的优先级比任务1的优先级高,因此打印信息,先打印的是任务2,截图如下:
接着将任务1的优先级设置为最高的,然后编译,试试看是否符合自己的预期。
注:转载请注明出处,谢谢!^_^