线程属性 pthread_attr_t 简介

1、原型:

1.1、初始化:

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

1.2 、去初始化:

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

1.3、结构体:

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;

2、pthread_attr_t 成员参数解析:

2.1、detachstate :

PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE        //(缺省)

        表示新线程是否与进程中的其他线程脱离同步。这个属性也可以在线程运行后调用 pthread_detach() 执行。线程可以从joinable切换到detach,但是不能从detach切换到joinable

TIPS:detach有什么用?

        如果是joinable,则线程退出后不会自动回收资源(包括 8M 的堆栈空间和线程描述符等),
detach后,线程会在退出时自动回收资源。所以,在主线程不需要通过pthread_join来获得子线程的退出状态时,一律detach掉。

2.2、schedpolicy :

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

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

2.3、sched_param :

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

2.4、inheritsched :

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

2.5、scope :

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

表示线程间竞争CPU的范围

3、操作:

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

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

例如:

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

4、使用举例:

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);
	
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值