一、原型:
初始化:
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的范围。
扫描二维码关注公众号,回复:
12415044 查看本文章

二、操作:
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, ¶m);
pthread_attr_setschedparam(new_attr, ¶m);
pthread_attr_getguardsize(old_attr, &size);
pthread_attr_setguardsize(new_attr, size);
}
pthread_attr_setdetachstate(new_attr, PTHREAD_CREATE_DETACHED);
}