pthread线程属性介绍

线程属性

创建线程函数

int pthread_create (pthread_t* restrictthread,  const pthread_attr_t* restrictattr,void* (*start_routine) (void*), void* restrict arg);

的第二个参数即为线程属性,传空指针表示使用缺省属性。

线程属性为一个结构体,具体如下

typedef struct

{

int        detachstate;       //线程的分离状态

int        schedpolicy;    //线程调度策略

structsched_param  schedparam;  //线程的调度参数

int         inheritsched;     //线程的继承性

int         scope;         //线程的作用域

size_t       guardsize;     //线程栈末尾的警戒缓冲区大小

void*       stackaddr;      //线程栈的位置

size_t       stacksize;        //线程栈的大小

}pthread_attr_t;

一、线程分离状态:detachstate

该属性决定了线程执行任务后以什么方式来结束自己。

方式如

(1) PTHREAD_CREATE_DETACHED    ——    分离线程

置为分离线程的线程,当不需要被任何线程等待,线程执行完任务后,自己自动结束线程,并释放资源。

(2) PTHREAD_CREATE_JOINABLE(缺省)  ——    可汇合线程

可汇合线程为线程的默认状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。

二、线程的调度策略:schedpolicy

(1) SCHED_FIFO(先进先出策略)

FIFO线程持续运行,直至有更高优先级的线程就绪,或者线程本身进入阻塞状态,

当FIFO线程阻塞时,系统将其移出就绪队列,恢复后再加入到同优先级就绪队列的末尾。当FIFO线程被高优先级线程抢占时,它在就绪队列中的位置不变,因此一旦高优先级线程终止或阻塞,被抢占的FIFO线程会立即继续运行

(2) SCHED_RR(轮转策略)

每个RR线程会获得一个时间片,一旦RR线程的时间片耗尽,系统即将移到就绪队列的末尾。

(3) SCHED_OTHER(缺省)

静态优先级为0。任何就绪的FIFO线程或RR线程,都会抢占此类线程。

三、调度参数 : sched_param  schedparam

这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是sched_param结构或指向该结构的指针。结构sched_param在文件/usr/include /bits/sched.h中定义如下:

struct sched_param

{

intsched_priority;

};

结构sched_param的子成员sched_priority控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用sched_get_priority_max函数和sched_get_priority_min函数分别得到。

注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。

四、线程的继承性: inheritsched

(1) PTHREAD_INHERIT_SCHED(缺省) —— 调度属性自创建者线程继承

(2) PTHREAD_EXPLICIT_SCHED —— 调度属性由调度参数和调度策略决定

继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息。Pthreads不为inheritsched指定默认值,因此如果你关心线程的调度策略和参数,必须先设置该属性。

五、线程的作用域:scope

线程的竞争范围。

PTHREAD_SCOPE_SYSTEM ——在系统范围内竞争资源。

PTHREAD_SCOPE_PROCESS(Linux不支持)——在进程范围内竞争资源

六、线程栈末尾的警戒缓冲区大小:guardsize

该属指定线程末尾的警戒缓冲区大小,在缺省的情况下为一个内存页(4096字节)

七、线程栈的位置:stackaddr

八、线程栈的大小:stacksize

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 09:05:49

pthread线程属性介绍的相关文章

【C/C++多线程编程之四】终止pthread线程

多线程编程之终止pthread线程  Pthread是 POSIX threads 的简称,是POSIX的线程标准.           终止线程似乎是多线程编程的最后一步,但绝不是本系列教材的结束.线程创建到线程终止,希望先给读者一个关于多线程编程的总体认识.           1.终止Pthread线程:pthread_exit()           參数:           ret:地址指针,本质上是返回值写入的地址.           终止线程是线程的主动行为,一个线程调用pth

【C/C++多线程编程之五】pthread线程深入理解

多线程编程之pthread线程深入理解  Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念.在进一步学习线程同步等多线程核心知识之前,须要对多线程深入的理解.非常多人忽略或者回避这部分内容,直接的问题是学习者无法把握多线程编程的内在原理,理解的层次太浅.           1.进程资源:                      进程资源有存储资源与其它资源.其它资源包括环境变量.地址,文件等.存储资源.进程的内存分配,博客[

【C/C++多线程编程之十】pthread线程私有数据

多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,条件变量[C/C++多线程编程之八]pthread条件变量,读写锁[C/C++多线程编程之九]pthread读写锁,多线程的同步机制已经有了清晰深入的探究,多线程编程的精髓所在,需要深入理解.        线程私有数据TSD(Thread-specific Data)

分享一个关于pthread线程栈在mm_struct里面的分布问题

大家好,本人被下面这个问题困扰了一段时间,最近似乎找到了答案. 这里和大家分享一下,可能对有相同困惑的同学有点帮助,同时也请各位帮忙看看错漏的地方. 1================问题: 在使用pthread库创建两个线程时clone()被调用了两次,可以用strace 看到: int main() { ...         err=pthread_create(&tid, NULL, job, NULL);         err=pthread_create(&tid1, NUL

pthread 线程

1.线程的创建 int ret  = pthread_create(&thdid,NULL,th_func,void *p); th_func 执行程序任务  创建成功返回 0 thid --->pthread_t 是线程号,在这里做传出参数. p 是th_func 的参数,使用时需要强制转换为void * void* thread(void* p) { //线程的开始 int i=(int)p;//强制转换为整型 printf("I am child thread %d\n&qu

多线程编程之pthread线程深入理解

不同的平台和操作系统上 进程和线程的实现机制不完全一致  但是一般来说线程栈都是独立的 只要得到地址就可以相互访问  Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念,在进一步学习线程同步等多线程核心知识之前,需要对多线程深入的理解.很多人忽略或者回避这部分内容,直接的问题是学习者无法把握多线程编程的内在原理,理解的层次太浅.             1.进程资源:                      进程资源有存储资源与

pThread线程(二) 线程同步--互斥量/锁

互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法. 互斥量对共享数据的保护就像一把锁.在Pthreads中,任何时候仅有一个线程可以锁定互斥量,因此,当多个线程尝试去锁定该互斥量时仅有一个会成功.直到锁定互斥量的线程解锁互斥量后,其他线程才可以去锁定互斥量.线程必须轮着访问受保护数据. 一个拥有互斥量的线程经常用于更新全局变量.确保了多个线程更新同样的变量以安全的方式运行,最终的结果和一个线程处理的结果是相同的.这个更新的变量

pThread线程(三) 线程同步--条件变量

条件变量(Condition Variables) 参考资料:http://game-lab.org/posts/posix-thread-cn/#5.1 条件变量是什么? 条件变量为我们提供了另一种线程间同步的方法,然而,互斥量是通过控制线程访问数据来实现同步,条件变量允许线程同步是基于实际数据的值. 如果没有条件变量,程序员需要让线程不断地轮询,以检查是否满足条件.由于线程处在一个不间断的忙碌状态,所以这是相当耗资源的.条件变量就是这么一个不需要轮询就可以解决这个问题的方法. 条件变量总是跟

pthread线程特定数据

线程特定数据,也被称为线程私有数据,是一种存储和查找一个特定线程相关数据的机制.我们称这个数据为线程特定或线程私有的原因,是因为每个线程访问它自己独立的数据拷贝,而不用担心和其它线程的访问的同步. 线程特定数据看似很复杂,其实我们可以把它理解为就是一个索引和指针.key结构中存储的是索引,pthread结构中存储的是指针,指向线程中的私有数据,通常是malloc函数返回的指针. POSIX要求实现POSIX的系统为每个进程维护一个称之为Key的结构数组(如图1所示),这个数组中的每个结构称之为一