线程属性结构如下:
typedef struct
{
int detachstate; 线程的分离状态
int schedpolicy; 线程调度策略
structsched_param schedparam; 线程的调度参数
int inheritsched; 线程的继承性
int scope; 线程的作用域
size_t guardsize; 线程栈末尾的警戒缓冲区大小
int stackaddr_set;
void* stackaddr; 线程栈的位置
size_t stacksize; 线程栈的大小
}pthread_attr_t;
对于每一个属性而言,都有查看&修改其属性值的函数。
1. 线程的分离状态
线程的分离状态决定一个线程以什么方式来终止自己。
默认情况下,非分离状态:线程return/pthread_ext -> 其他线程pthread_join返回 -> 线程释放自己占用的资源;
分离状态:线程return/pthread_ext -> 线程释放自己占用的资源
问题:若pthread_join等待已分离状态的线程,会如何?立即返回还是?
2. 线程的继承性
继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息.
3. 线程的作用域
竞争资源的作用域:是在进程内还是在系统内;
取值:PTHREAD_SCOPE_PROCESS(进程内竞争资源)PTHREAD_SCOPE_SYSTEM.(系统级上竞争资源)
4. 线程堆栈的大小
5. 线程栈末尾的警戒缓冲区大小
线程属性guardsize控制着线程栈末尾之后以避免栈溢出的扩展内存大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线程属性设为0,从而不允许属性的这种特征行为发生:在这种情况下不会提供警戒缓存区。同样地,如果对线程属性stackaddr作了修改,系统就会假设我们会自己管理栈,并使警戒栈缓冲区机制无效,等同于把guardsize线程属性设为0