线程属性 pthread_attr_t 简介

一、原型:

初始化:

int pthread_attr_init(pthread_attr_t *attr); //按照默认设置初始化

去初始化:

int pthread_attr_destroy(pthread_attr_t *attr); //还原设置

结构体:

typedef sturct {
    
    
	int					detachstate;	//线程是否分离同步	//PHTREAD_CREATE_DETACHED
	
	int					schedpolicy;	//线程的调度策略	//SCHEC_OTHER
	struct sched_param	sched_param;	//线程的调度参数
	int					inheritsched;	//线程的调度策略的继承性	//PTHREAD_EXPLICIT_SCHED
	
	int					scope;			//线程竞争CPU的范围		//PTHREAD_SCOPE_SYSTEM
	
	size_t				guardsize;		//线程栈空间末尾缓冲区的大小
	int					stackaddr_set;	//栈设置
	void*				sockaddr;		//栈位置
	
	size_t				stacksize;		//栈大小(默认8192KB = 8M)
} pthread_attr_t;

pthread_attr_t 成员参数解析:

(1)detachstate :

PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE		//(缺省)

表示新线程是否与进程中的其他线程脱离同步。

这个属性也可以在线程运行后调用 pthread_detach() 执行。
线程可以从joinable切换到detach,但是不能从detach切换到joinable。

TIPS:detach有什么用?

如果是joinable,则线程退出后不会自动回收资源(包括 8M 的堆栈空间和线程描述符等),
detach后,线程会在退出时自动回收资源。

所以,在主线程不需要通过pthread_join来获得子线程的退出状态时,一律detach掉。

(2)schedpolicy :

SCHED_OTHER		//(缺省)非实时,正常
SCHED_RR				//实时,轮转法
SCHED_FIFO			//实时,先入先出

线程调度策略。
后两种仅对root超级用户有效。

(3)sched_param :

此参数仅在实时调度下才有效(SCHED_RR、SCHED_FIFO)。

(4)inheritsched :

PTHREAD_EXPLICIT_SCHED		//(缺省)显式指定自己的调度策略和调度参数
PTHREAD_INHERIT_SCHED			//继承调用者线程的值(调度策略和调度参数)

(5)scope :

PTHREAD_SCOPE_SYSTEM			//(缺省)(目前Linux下仅支持此配置)与系统中的所有线程竞争CPU
PTHREAD_SCOPE_PROCESS		//只与进程中的线程竞争CPU

表示线程间竞争CPU的范围。

二、操作:

Linux提供了一组函数用于操作 pthread_attr_t :

pthread_attr_get***();	//用于获取旧的设置项
pthread_attr_set***();	//用于传入新的设置项

例如:

pthread_attr_t *attr;
pthread_attr_setdetachstate(*attr, PHTREAD_CREATE_DETACHED);

三、使用举例:

static void ntyCloneAttributes(pthread_attr_t *new_attr, pthread_attr_t *old_attr) {
    
    

	struct sched_param param;
	void *addr;
	size_t size;
	int value;

	pthread_attr_init(new_attr);
	
	if (old_attr != NULL) {
    
    
		pthread_attr_getstack(old_attr, &addr, &size);
		pthread_attr_setstack(new_attr, NULL, size);

		pthread_attr_getscope(old_attr, &value);
		pthread_attr_setscope(new_attr, value);

		pthread_attr_getinheritsched(old_attr, &value);
		pthread_attr_setinheritsched(new_attr, value);

		pthread_attr_getschedpolicy(old_attr, &value);
		pthread_attr_setschedpolicy(new_attr, value);

		pthread_attr_getschedparam(old_attr, &param);
		pthread_attr_setschedparam(new_attr, &param);

		pthread_attr_getguardsize(old_attr, &size);
		pthread_attr_setguardsize(new_attr, size);
	}

	pthread_attr_setdetachstate(new_attr, PTHREAD_CREATE_DETACHED);
	
}

猜你喜欢

转载自blog.csdn.net/ArtAndLife/article/details/112147747
今日推荐