Linux 之 设置线程属性

Linux 之 设置线程属性

正文

可以在线程创建调用pthread_create函数时指定线程属性。
线程属性是一个结构体:

typedef struct
{
    
    
int 					etachstate; 	//线程的分离状态
int 					schedpolicy; 	//线程调度策略
struct sched_param	schedparam; 	//线程的调度参数
int 					inheritsched; 	//线程的继承性
int 					scope; 		//线程的作用域
size_t 				guardsize; 	//线程栈末尾的警戒缓冲区大小
int					stackaddr_set; //线程的栈设置
void* 				stackaddr; 	//线程栈的位置
size_t 				stacksize; 	//线程栈的大小
} pthread_attr_t; 

设置线程属性首先要创建一个 pthread_attr_t 的结构体。然后使用pthread_attr_init函数对其进行初始化,在使用过后用pthread_attr_destroy对其进行销毁。
初始化线程属性:
int pthread_attr_init(pthread_attr_t *attr); 成功:0;失败:错误号
销毁线程属性:
int pthread_attr_destroy(pthread_attr_t *attr); 成功:0;失败:错误号

修改线程分离态

线程分离状态的函数:设置线程属性,分离or非分离
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
获取程属性: 分离or非分离
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
参数
attr:已初始化的线程属性
detachstate:
PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD _CREATE_JOINABLE(非分离线程)
这里要注意的一点是,如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用pthread_cond_timedwait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<errno.h>
#include<pthread.h>

void * fun(void * arg)
{
    
    
   sleep(1);
   printf("thread[%ld] is executing\n",pthread_self());
   return NULL;
}
int main()
{
    
    

   pthread_attr_t attr;
   pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
   pthread_t id;
   pthread_create(&id,&attr,fun,NULL);
   pthread_attr_destroy(&attr);
   printf("main thread exited\n");
   pthread_exit((void*)0);
}

输出:
main thread exited
thread[140261883602688] is executing

修改线程栈地址

当进程栈地址空间不够用时,指定新建线程使用由malloc分配的空间作为自己的栈空间。通过pthread_attr_setstack和pthread_attr_getstack两个函数分别设置和获取线程的栈地址。
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); 成功:0;失败:错误号
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize); 成功:0;失败:错误号
参数: attr:指向一个线程属性的指针
stackaddr:返回获取的栈地址
stacksize:返回获取的栈大小

修改线程栈大小

当系统中有很多线程时,可能需要减小每个线程栈的默认大小,防止进程的地址空间不够用,当线程调用的函数会分配很大的局部变量或者函数调用层次很深时,可能需要增大线程栈的默认大小。
函数pthread_attr_getstacksize和 pthread_attr_setstacksize提供设置。
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); 成功:0;失败:错误号
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize); 成功:0;失败:错误号
参数: attr:指向一个线程属性的指针
stacksize:返回线程的堆栈大小

猜你喜欢

转载自blog.csdn.net/weixin_45074185/article/details/108550825