正在加载……
专注、离线、切勿分心

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...\n");

       sleep(1);

}

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

exit(EXIT_SUCCESS);

}

 

void *thread_function(void *arg)

{

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

sleep(4);

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

thread_finished = 1;

pthread_exit(NULL);

}



posted on 2018-03-09 08:43  正在加载……  阅读(202)  评论(0编辑  收藏  举报