Unix环境变量--线程相关属性

一、线程属性

属性值不能直接设置,须使用相关函数进行操作,初始化的函数为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映射到第一种标准类型上。

另外,读写锁、屏障、以及条件变量的属性都很简单,就不再累述,其中读写锁及屏障只有共享属性,意义同线程属性的共享属性一样。条件变量里面有个特殊属性,就是设置超时参数时,可以指定超时采用的是哪种时钟类型

猜你喜欢

转载自blog.csdn.net/Chiang2018/article/details/105418675
今日推荐