• 线程属性


    pthread_create的第二个参数attr是一个结构体指针,结构中的元素分别指定新线程的运行属性,各成员属性为:

           __detachstate表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。

           __schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。

           __schedparam,一个sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RRSCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0

           __inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHEDPTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED

           __scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEMPTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前Linux仅实现了PTHREAD_SCOPE_SYSTEM一值。

    属性设置是由一些函数来完成的,通常调用pthread_attr_init函数进行初始化。设置绑定属性的函数为pthread_attr_setscope,设置分离属性的函数是pthread_attr_setdetachstate,设置线程优先级的相关函数pthread_attr_getscehdparam(获取线程优先级)和pthread_attr_setschedparam(设置线程优先级)。再设置完成属性后,调用pthread_creat函数创建线程。

           ·线程属性初始化:

                  int pthread_attr_init (pthread_attr_t *attr);

    attr:传出参数,表示线程属性,后面的线程属性设置函数都会用到。

    返回值:成功0,错误-1

           ·设置绑定属性:

                  pthread_attr_setscope(pthread_attr_t *attr, init scope);

    attr:线程属性

    scopePTHREAD_SCOPE_SYSTEM(绑定)      PTHREAD_SCOPE_PRCESS(非绑定)

    返回值:成功0,错误-1

    ·设置分离属性:

                  pthread_attr_setdetachstate(pthread_attr_t    *attr, init detachstate);

    attr:线程属性

    detachstate PTHREAD_CREAT_DETACHED(分离)       PTHREAD_CREAT_JOINABLE(非分离)

    返回值:成功0,错误-1

    ·获取线程优先级:

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

    attr:线程属性

    param:线程优先级

    返回值:成功0,错误-1

    ·设置线程优先级:

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

    attr:线程属性

    param:线程优先级

    返回值:成功0,错误-1

     

    实例:

    #include <stdio.h>

    #include <unistd.h>

    #include <stdlib.h>

    #include <pthread.h>

     

    void *thread_function(void *arg);

     

    char message[] = "Hello World";

    int thread_finished = 0;

     

    int main()

    {

       int res = 0;

       pthread_t a_thread;

       void *thread_result;

       pthread_attr_t  thread_attr;  //定义属性

       struct sched_param scheduling_value;

       res = pthread_attr_init(&thread_attr);   //属性初始化

    if (res != 0)

    {

           perror("Attribute creation failed");

           exit(EXIT_FAILURE);  // EXIT_FAILURE  -1

    }

       

                  //设置调度策略

                  res = pthread_attr_setschedpolicy(&thread_attr, SCHED_OTHER);

    if (res != 0)

    {

           perror("Setting schedpolicy failed");

           exit(EXIT_FAILURE);

    }

     

    //设置脱离状态

    res = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);

     

    //创建线程

        res = pthread_create(&a_thread, &thread_attr, thread_function, (void *)message);

        if (res != 0) {

            perror("Thread creation failed");

            exit(EXIT_FAILURE);

    }

     

    //获取最大优先级别

    int  max_priority = sched_get_priority_max(SCHED_OTHER);

    //获取最小优先级

    int  min_priority = sched_get_priority_min(SCHED_OTHER);

     

    //重新设置优先级别

    scheduling_value.sched_priority = min_priority + 5;

    //设置优先级别

    res = pthread_attr_setschedparam(&thread_attr, &scheduling_value);

     

    pthread_attr_destroy(&thread_attr);

     

    while(!thread_finished)

    {

           printf("Waiting for thread to say it's finished... ");

           sleep(1);

    }

    printf("Other thread finished, bye! ");

    exit(EXIT_SUCCESS);

    }

     

    void *thread_function(void *arg)

    {

    printf("thread_function is running. Argument was %s ", (char *)arg);

    sleep(4);

    printf("Second thread setting finished flag, and exiting now ");

    thread_finished = 1;

    pthread_exit(NULL);

    }



  • 相关阅读:
    shell预备知识
    php session和cookie
    php数据库访问抽象层PDO
    递归求斐波那契数
    SqlDataReader的使用
    DataAdapter与DataSet的使用
    CLR
    Android Studio javadoc 生成注释文档
    MySQL教程之concat以及group_concat的用法
    一文读懂MQTT协议
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8531962.html
Copyright © 2020-2023  润新知