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_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_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:线程属性
scope:PTHREAD_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);
}