12.6 线程属性

线程可以经过更多高级内容的设置,可以控制的属性很多;

前面的例子中,我们在程序退出之前用了pthread_join 对线程再次同步,如果我们想让线程向创建它的线程返回数据就需要这个函数。
但是有的时候,有可能我们不需要这些函数返回给主线程信息,也不想让主线程等待它的结束。(ios经常会出现了几秒中之后执行某个程序,应该就是没有返回给主线程任何消息)

现实假设: 假设我们给主线程继续为用户提供服务的同时创建第二个线程,新线程的作用是用户在编辑数据的文件-进行备份存储。备份工作结束后,第二个线程就可以直接终止了,没有必要再回到主线程中。
=====> 我们可以创建这一类型的线程,它们被称为脱离线程(detached thread)。
可以通过(1)修改线程属性或(2)调用pthread_detach 的方法来创建它们。
头文件: pthread.h
int pthread_attr_init(pthread_attr_t *attr); 初始化, 成功返回0,
int pthread_attr_destroy(pthread_attr_t *); 目的是对属性对象进行清理和回收。一旦对象被回收,除非重新初始化,否则不能够再次被调用了。
初始化一个线程属性对象后,我们可以调用线程属性的很多对象来设置属性行为。

int pthread_attr_destroy(pthread_attr_t *);
int pthread_attr_getdetachstate(const pthread_attr_t *, int *);
int pthread_attr_getguardsize(const pthread_attr_t * __restrict, size_t * __restrict);
int pthread_attr_getinheritsched(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getschedparam(const pthread_attr_t * __restrict,
struct sched_param * __restrict);
int pthread_attr_getschedpolicy(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getscope(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getstack(const pthread_attr_t * __restrict,
void * _Nullable * _Nonnull __restrict, size_t * __restrict);
int pthread_attr_getstackaddr(const pthread_attr_t * __restrict,
void * _Nullable * _Nonnull __restrict);
int pthread_attr_getstacksize(const pthread_attr_t * __restrict, size_t * __restrict);
int pthread_attr_init(pthread_attr_t *);
int pthread_attr_setdetachstate(pthread_attr_t *, int);
int pthread_attr_setguardsize(pthread_attr_t *, size_t);
int pthread_attr_setinheritsched(pthread_attr_t *, int);
int pthread_attr_setschedparam(pthread_attr_t * __restrict,
const struct sched_param * __restrict);
int pthread_attr_setschedpolicy(pthread_attr_t *, int);
int pthread_attr_setscope(pthread_attr_t *, int);
int pthread_attr_setstack(pthread_attr_t *, void *, size_t);
int pthread_attr_setstackaddr(pthread_attr_t *, void *);
int pthread_attr_setstacksize(pthread_attr_t *, size_t);
可以看到可以设置属性的属性很多的。😀 ,下面是一个常用的设置:
(1)detachedstate : 这个属性允许我们无需对线程进行重新合并。与大多数set类函数一样。它以一个属性指针和一个标志位参数来确定需要的状态。pthread_attr_setdetachstate 函数可能用到的两个标志分别是PTHREAD_CREATE_JOINABLE 和 PTHREAD_CREATE_DETACHED. 这个属性的默认标志值是PTHREAD_CREATE,而JOINABLE ,所以,可以允许两个线程重新合并。如果表示设置为PTHREAD_CREATE_DETACHED,就不能调用pthread_join 来获得另外一个线程的退出状态。
(2)schedpolicy : 这个属性控制线程的调度方式。取值可以是:SCHED_OTHE、SCHED_RP 和SCHED_FIFO。 这个属性的默认值为SHCED_OTHER .另外两中调度方式只能用于超级用于权限运行的进程,因为它们都具备实时调度的功能,但在行为上略有区别。SCHED_RP 使用循环(round-robin) 调度机制。而schedpolicy 使用"先进先出策略"。
(3)schedparam : 这个属性是和schedpolicy 属性结合使用的,它可以对以SCHED_OTHER 策略运行的线程的调度进行控制。
(4)inheritsched : 这个属性可以取两个值:PTHREAD_EXPLICIT_SCHED 和PTHREAD_INHERIT_SCHED .它的默认取值是PTHEAD_EXPLICTT_SCHED. 表示调度由属性明确地设置。如果把它设置为PTHREAD_INHERIT_SCHED ,新线程将沿用其创建者所使用的参数。
(5)scope: 这属性控制一个线程调度的计算方式。由于目前Linux只是支持PTHREAD_SCOPE_SYSTEM ,。
(6)stacksize : 这个属性控制线程创建的栈大小,单位为字节。它属于POSIX 规范中的“可选”部分,只有在定义了宏_POSIX_THREAD_ATTR_STTACKSIZE 实现版本才会支持。linux实现线程时,默认使用的栈很大。所以这个功能对linux俩说显得有点多余。

推荐阅读更多精彩内容