一、线程属性
属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。之后须用pthread_attr_destroy函数来释放资源。
线程属性pthread_attr_t结构体如下:
typedef struct{
int detachstate; //线程的分离状态
int schedpolicy; //线程调度策略
struct sched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //线程的栈设置
void* stackaddr; //线程栈的位置(最低地址)
size_t stacksize; //线程栈的大小
} pthread_attr_t;
常用函数
int pthread_attr_init(pthread_attr_t *attr);//初始化
int pthread_attr_destroy(pthread_attr_t *attr); //销毁属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
作用:设置和获取线程的分离属性。
参数 :attr:已初始化的线程属性
detachstate: PTHREAD_CREATE_DETACHED(分离线程) PTHREAD _CREATE_JOINABLE(非分离线程)
非分离状态:线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
分离状态:分离线程不需要被其他的线程所等待,自己运行结束了,线程也就终止了, 马上释放系统资源。
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
参数:attr:指向一个线程属性的指针(由pthread_attr_init函数初始化) stackaddr:返回获取的栈地址(malloc分配) stacksize:返回获取的栈大小
作用:当进程栈地址空间不够用时,指定新建线程使用由malloc分配的空间作为自己的栈空间。
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
参数:attr:指向一个线程属性的指针(由pthread_attr_init函数初始化) stacksize:返回线程的堆栈大小
作用:如果希望改变默认的栈大小,而又不想自己处理线程栈的分配问题时使用
int pthread_attr_setguardsize(pthread_attr_t *attr,size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize);
作用:线程属性guardsize控制着线程栈末尾之后用以避免栈溢出的扩展内存大小
二、互斥量属性
int pthread_mutexattr_init(pthread_mutexattr_t *attr);//初始化属性
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);//销毁属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
参数:pshared的取值有两种:
PTHREAD_PROCESS_PRIVATE(默认):仅有那些由同一个进程创建的线程才能够处理该互斥锁
PTHREAD_PROCESS_SHARED:多个进程中的线程之间共享互斥锁
作用:设置或获取互斥量的共享属性
int pthread_mutexattr_getrobust(const pthread_mutexattr_t *restrict attr, int *restrict robust);
int pthread_mutexattr_setrobust(pthread_mutexattr_t *attr,int robust);
参数:robust的取值有两种:
PTHREAD_MUTEX_STALLED(默认):意味着持有互斥量的进程终止时不会有特别的动作
PTHREAD_MUTEX_ROBUST:在进程终止后,等待中的线程调用pthread_mutex_lock,会从中返回EOWNERREAD而不是0.
作用:健壮属性用于多进程共享的互斥量。当持有互斥量的进程终止时,需要解决互斥量状态恢复的问题。该属性默认值为。
int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
作用:设置互斥量的类型。常用类型如下:
PTHREAD_MUTEX_NORMAL标准互斥量类型,不做特殊的错误检查和死锁检测。
PTHREAD_MUTEX_ERRORCHECK 此类型提供错误检查。PTHREAD_MUTEX_RECURSIVE 递归类型,此种类型允许同一线程在互斥量解锁之前对该互斥量进行多次加锁。递归互斥量维护锁的计数,在解锁次数与加锁次数不同的情况下,不会释放锁。PTHREAD_MUTEX_DEFAULT此类型提供默认特性,操作系统实现时会把它映射到上面三种中的一种上。linux映射到第一种标准类型上。
另外,读写锁、屏障、以及条件变量的属性都很简单,就不再累述,其中读写锁及屏障只有共享属性,意义同线程属性的共享属性一样。条件变量里面有个特殊属性,就是设置超时参数时,可以指定超时采用的是哪种时钟类型