tag 标签: 线程

相关博文
  • 热度 18
    2015-7-31 17:05
    1502 次阅读|
    0 个评论
    SylixOS 支持 POSIX 编程标准,其优先级调度可以使用 POSIX 的函数直接设置,但测试发现在优先级调度上有稍许不同, SylixOS 下的优先级调度策略只支持 SCHED_RR 、 SCHED_FIFO 两种,不支持 SCHED_OTHER 。不过作为一个实时系统,如此设计也是理所当然。 在 SylixOS 优先级上需要注意, SylixOS 自身定义的 API 设置优先级时优先级设置值越小则该线程优先级越高。如果使用 POSIX 定义 API ,优先级设置值越大其优先级越高。在文件 k_priority.h 中说明了 SylixOS 中优先级设置使用注意事项,这里的优先级针对 SylixOS 自定义 API ,在 POSIX 下用户线程优先级设置范围为 5 ~ 205 。 /************************************************************************   优先级 (一般应用的最高优先级不能高于 LW_PRIO_CRITICAL 最低不能低过 LW_PRIO_LOW) ************************************************************************/ #define LW_PRIO_EXTREME    LW_PRIO_HIGHEST  /*  最高优先级            */ #define LW_PRIO_CRITICAL   50               /*  关键处理任           */ #define LW_PRIO_REALTIME   100              /*  实时处理任务         */ #define LW_PRIO_HIGH       150              /*  高优先级任务         */ #define LW_PRIO_NORMAL     200              /*  正常优先级           */ #define LW_PRIO_LOW        250              /*  低优先级             */ #define LW_PRIO_IDLE       LW_PRIO_LOWEST   /*  最低优先级           */ 为了对比 SylixOS 优先级调度的结果,设计 2 个线程分别验证: SCHED_FIFO 调度模式下,相同优先级的调度情况; SCHED_FIFO 调度模式下,不同优先级的调度情况; SCHED_RR 调度模式下,相同优先级的调度情况; SCHED_RR 调度模式下,不同优先级的调度情况; 使用默认设置创建线程,线程的调度情况。 在程序中创建两个线程,分别打印各自的信息,修改不同的调度方式和优先级,程序执行后会有不同的输出,读者根据代码中的提示查看修改即可。 #includestdio.h #includestdlib.h #includepthread.h #includesched.h #includeunistd.h #includesys/time.h #includesys/resource.h #includestring.h void *fun_thread(void *arg) {    int                id = (int)arg;    int                i,j;    int                policy;    int                priority;    struct sched_param param;    printf("thread %d start\n", id);    sleep(id + id);    pthread_getschedparam(pthread_self(), policy, param);    /* 分析线程的调度策略     * SylixOS中SCHED_RR与SCHED_OTHER的定义相同     */    if (policy == SCHED_RR) {        priority = param.sched_priority;        printf("thread %d SCHED_RR=%d \n", id, priority);    }    if (policy == SCHED_FIFO) {        priority = param.sched_priority;        printf("thread %d SCHED_FIFO=%d \n", id, priority);    }    for (i = 1; i 10; i++) {       for(j = 1; j 100000000; j++) {       }       printf("this is thread %d\n", id);    }    printf("Thread %d exit\n", id);    return (NULL); } int main(int argc, char *argv[]) {    int id = 0;    int i = getuid();    /*  获取当前进程用户名  */    if (i == 0) {       printf("The current user is root\n");    } else {       printf("The current user is not root\n");    }    pthread_t           tid1,tid2;    pthread_attr_t      attr1,attr2;    struct sched_param  param1;    struct sched_param  param2;    param1.sched_priority = 98;    param2.sched_priority = 99;    pthread_attr_init(attr1);    /*  使用默认设置初始化线程属性  */    pthread_attr_init(attr2);    /* PTHREAD_EXPLICIT_SCHED 新创建线程使用设置属性,     * PTHREAD_INHERIT_SCHED  新创建线程继承主线程属性     */    pthread_attr_setinheritsched(attr1, PTHREAD_EXPLICIT_SCHED);    pthread_attr_setinheritsched(attr2, PTHREAD_EXPLICIT_SCHED);    /*     * 设置线程调度策略     * SCHED_FIFO  若无更高优先级任务打断,该任务运行直至结束     * SCHED_RR    相同优先级任务会平衡调度,各个任务都能得到执行     * param1      设置线程优先级,     */    pthread_attr_setschedpolicy(attr1, SCHED_FIFO);    pthread_attr_setschedparam(attr1, param1);    pthread_attr_setschedpolicy(attr2, SCHED_FIFO);    pthread_attr_setschedparam(attr2, param2);    sleep(1);    /*     *  创建线程,并设置优先级,     *  若将 attr1/2 使用 NULL 替换,标识线程使用默认设置创建     */    id++;    pthread_create(tid1, attr1, fun_thread, (void *)id);    id++;    pthread_create(tid2, attr2, fun_thread, (void *)id);    pthread_join(tid1, NULL);    pthread_join(tid2, NULL);    pthread_attr_destroy(attr1);    pthread_attr_destroy(attr2);    return (0); } 需要注意的是,由于线程中使用 for 循环模拟线程任务,当使用 release 版本编译时,会将此部分代码进行优化,从而影响实验效果。
  • 热度 17
    2013-10-15 16:49
    832 次阅读|
    2 个评论
        下面说一下如何创建一个线程。     通过创建线程,线程将会执行一个线程函数,该线程格式必须按照下面来声明:     void * Thread_Function(void *)     创建线程的函数如下:     int pthread_create(pthread_t *restrict thread,     const pthread_attr_t *restrict attr,     void *(*start_routine)(void*), void *restrict arg);     下面说明一下各个参数的含义:     thread:所创建的线程号。     attr:所创建的线程属性,这个将在后面详细说明。     start_routine:即将运行的线程函数。     art:传递给线程函数的参数。     下面是一个简单的创建线程例子:     #include     #include     /* Prints x’s to stderr. The parameter is unused. Does not return. */     void* print_xs (void* unused)     {     while (1)     fputc (‘x’, stderr);     return NULL;     }     /* The main program. */     int main ()     {     pthread_t thread_id;     /* Create a new thread. The new thread will run the print_xs     function. */     pthread_create (thread_id, NULL, print_xs, NULL);     /* Print o’s continuously to stderr. */     while (1)     fputc (‘o’, stderr);     return 0;     }     在编译的时候需要注意,由于线程创建函数在libpthread.so库中,所以在编译命令中需要将该库导入。命令如下:     gcc –o createthread –lpthread createthread.c     如果想传递参数给线程函数,可以通过其参数arg,其类型是void *。如果你需要传递多个参数的话,可以考虑将这些参数组成一个结构体来传递。另外,由于类型是void *,所以你的参数不可以被提前释放掉。     下面一个问题和前面创建进程类似,不过带来的问题回避进程要严重得多。如果你的主线程,也就是main函数执行的那个线程,在你其他县城推出之前就已经退出,那么带来的bug则不可估量。通过pthread_join函数会让主线程阻塞,直到所有线程都已经退出。     int pthread_join(pthread_t thread, void **value_ptr);     thread:等待退出线程的线程号。     value_ptr:退出线程的返回值。     下面一个例子结合上面的内容:     int main ()     {     pthread_t thread1_id;     pthread_t thread2_id;     struct char_print_parms thread1_args;     struct char_print_parms thread2_args;     /* Create a new thread to print 30,000 x’s. */     thread1_args.character = ’x’;     thread1_args.count = 30000;     pthread_create (thread1_id, NULL, char_print, thread1_args);     /* Create a new thread to print 20,000 o’s. */     thread2_args.character = ’o’;     thread2_args.count = 20000;     pthread_create (thread2_id, NULL, char_print, thread2_args);     /* Make sure the first thread has finished. */     pthread_join (thread1_id, NULL);     /* Make sure the second thread has finished. */     pthread_join (thread2_id, NULL);     /* Now we can safely return. */     return 0;    }         转自:http://emb.sunplusedu.com/answer/2013/0709/1931.html
相关资源