在上一节中我们介绍的线程的创建、退出等一些基本的知识,这节我们讲述线程的属性
第一节传送门 https://blog.csdn.net/qq_37120369/article/details/91450630
上一节中在创建线程时属性我们采用的默认属性(即NULL),接下来我们重点介绍一下第二个参数。
一般只有在特殊情况下才设置线程属性,属性对象主要包括是否绑定,是否分离,堆栈地址,堆栈大小,优先级。
默认属性为非绑定,非分离,默认1MB的堆栈,与父进程同样级别的优先级
一、绑定属性
Linux中采用“一对一”的线程机制,也就是一个用户线程对应一个内核线程。绑定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程的,因此绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。
非绑定属性就是指用户线程与内核线程的分配不是固定的,由系统控制分配。
设置绑定属性的函数为pthread_attr_setscope,它有俩个参数,一个是指向属性结构的指针,另一个是绑定类型,取值为PTHREAD_SCOPE_SYSTEM(绑定的),PTHREAD_SCOPE_PROCESS(非绑定的)。
二、分离属性
分离属性是用来决定一个线程以什么方式结束自己。非分离情况下,当一个线程结束自己时,它所占有的资源并没有立即释放,等到pthread_join函数返回时才真正释放,而分离情况下线程一结束便立即释放自己占有的资源。
需要大家注意一点:如果设置一个线程的分离属性,而这个线程又运行的非常快,那么很可能在pthread_create函数返回前就终止了,它终止后的各种资源很有可能就移交给其他线程使用了。
设置分离属性的函数为pthread_attr_setdetachstate,它有俩个参数,一个指向属性结构的指针,另一个是属性类型,取值为
PTHREAD_CREATE_DETACHED(分离的),PTHREAD_CREATE_JOINABLE(非分离的,连接的)。
注意:分离时不使用pthread_join等待
三、线程优先级
线程优先级存放在结构sched_param中,可以通过函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,一般都是先取优先级,对取得的值修改后再存放回去。
四、线程属性修改步骤如下:
1.初始化线程属性。调用pthread_attr_init(&attr)初始化属性结构指针,必须在pthread_create前调用。
2.调用相应的属性设置函数。
3.调用pthread_attr_destory(&attr)对分配的属性结构指针清理回收。
接下来执行一个例程:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUMBER 1
#define REPEAT_NUMBER 2
#define DELAY_TIME_LEVELS 5
int finish_flag=0;
void * thrd_func(void *arg)
{
int delay_time=0;
int count=0;
printf("Thread is starting\n");
for(count=0;count<REPEAT_NUMBER;count++)
{
delay_time=(int)((rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1);
sleep(delay_time);
printf("Thread:job %d delay %d\n",count,delay_time);
}
printf("Thread finished\n");
finish_flag=1;
pthread_exit(NULL);
}
int main(void)
{
pthread_t thread;
pthread_attr_t attr;
int res=0;
srand(time(NULL));
res=pthread_attr_init(&attr);//初始化属性结构指针
if(res!=0)
{
printf("Creat attribute failed\n");
exit(res);
}
//接下来调用相应属性设置函数
//修改线程默认属性,设置分离属性
res=pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);//绑定属性
res+=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//分离属性
if(res!=0)
{
printf("Setting attribute failed\n");
exit(res);
}
//创建线程
res=pthread_create(&thread,&attr,thrd_func,NULL);
if(res!=0)
{
printf("Create thread failed\n");
exit(res);
}
//销毁线程属性
pthread_attr_destroy(&attr);
printf("Create thread success\n");
while(!finish_flag)
{
printf("Waiting for thread to finish...\n");
sleep(2);
}
//pthread_join(thread,NULL); //分离属性时不能使用
return 0;
}
执行结果如下图:
参考书籍《基于项目驱动的嵌入式Linux应用设计开发》