收藏 分享(赏)

linux多线程编程.doc

上传人:wo7103235 文档编号:5856793 上传时间:2019-03-19 格式:DOC 页数:65 大小:500.50KB
下载 相关 举报
linux多线程编程.doc_第1页
第1页 / 共65页
linux多线程编程.doc_第2页
第2页 / 共65页
linux多线程编程.doc_第3页
第3页 / 共65页
linux多线程编程.doc_第4页
第4页 / 共65页
linux多线程编程.doc_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、 第一章 线程基础知识 2一什么是线程 2二线程的优点 2三线程的缺点 2四线程的结构 2五线程标识 2六线程的创建 3七.线程的终止 .4八、一次性初始化 8九、线程的私有数据 9第二章 线程高级知识 11一线程属性 11二、线程的分离状态 12三、线程的继承性 13四、线程的调度策略 13五、线程的调度参数 14六、线程的作用域 16七、线程堆栈的大小 17八、线程堆栈的地址 18九、线程栈末尾的警戒缓冲区大小 18第三章 Posix 有名信号灯 .19一、posix 有名信号灯函数 19二、关于 posix 有名信号灯使用的几点注意 .24三、posix 有名信号灯应用于多线程 25四、

2、posix 有名信号灯应用于多进程 .27五、基于内存的信号灯 29第四章 互斥量 39一、什么是互斥锁 39二、初始化/回收互斥锁 40三、对互斥量加减锁 40四、互斥锁属性 45五、应用互斥量需要注意的几点 48第五章 条件变量 48一、什么是条件变量 48二、条件变量函数 48三、条件变量属性 54四、条件变量与互斥锁、信号量的区别 55第六章 共享内存 56一、什么是共享内存区 56二、mmap .56三、posix 共享内存函数 60四、ftruncate 和 fstat 函数 .62五、共享内存区的写入和读出 64六、程序例子 65第一章 线程基础知识一什么是线程在一个程序里的多个

3、执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的一个控制序列”。典型的 unix 进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻能够做不止一件事,每个线程处理各只独立的任务。二线程的优点(1) 通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间的代码。(2) 多个线程可以自动共享相同的存储地址空间和文件描述符。(3) 有些问题可以通过将其分解从而改善整个程序的吞吐量。(4) 交互的程序可以通过使用多线程实现相应时间的改善,多线程可以把程序中处理用户输入输出的部分与其它部分分开。三线程的缺点线程也有不

4、足之处。编写多线程程序需要更全面更深入的思考。在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的。调试一个多线程程序也比调试一个单线程程序困难得多。四线程的结构线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的线程 ID,一组寄存器值、栈、调度优先级和策略、信号屏蔽子,errno 变量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局内存和堆内存、栈以及文件描述符。五线程标识就像每个进程有一个进程 ID 一样,每个线程也有一个线程 ID,进程 ID 在整个系统中是唯一的,但线程不同,线程

5、ID 只在它所属的进程环境中有效。线程 ID 用 pthread_t 数据类型来表示,实现的时候可以用一个结构来代表pthread_t 数据类型,所以可以移植的操作系统不能把它作为整数处理。因此必须使用函数来对来对两个线程 ID 进行比较。1名称:: pthread_equal功能: 比较两个线程 ID头文件: #include 函数原形: int pthread_equal(pthread_t tid1,pthread_t tid2);参数: tid1 进程 1id2 六线程的创建 3当 pthread_creat 成功返回时, tidp 指向的内存单元被设置为新创建线程的线程ID。 att

6、r 参数用于定制各种不同的线程属性。可以把它设置为 NULL,创建默认的线程属性。新创建的线程从 start_rtn 函数的地址开始运行,该函数只有一个无类型指针参数 arg,如果需要向 start_rtn 函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为 arg 参数传入。#include void printids(const char *s)printf(“%s pid:%u tid:%u n“, s,getpid(),pthread_self();void *thr_fn(void *arg)printids(“new thread: “);tid2

7、进程 2id返回值: 若相等返回非 0 值,否则返回 0名称:: pthread_self功能: 获取自身线程的 id头文件: #include 函数原形: pthread_t pthread_self(void);参数: 无返回值: 调用线程的线程 id名称:: pthread_create功能: 创建线程头文件: #include 函数原形: int pthread_create(pthread_t *restrict tidp,const pthread _attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg)

8、;参数: 返回值: 若成功返回则返回 0,否则返回错误编号int main()int err;pthread_t tid;err=pthread_create(if(err=0)printf(“cant create thread:%sn”,strerror(err);printids(“main thread: “);sleep(1);exit(0);关于进程的编译我们都要加上参数 lpthread 否则提示找不到函数的错误。具体编译方法是 cc lpthread o gettid gettid.c运行结果为main thread: pid 14954 tid 134529024new th

9、read: pid 14954 tid 134530048七.线程的终止线程是依进程而存在的,当进程终止时,线程也就终止了。当然也有在不终止整个进程的情况下停止它的控制流。(1)线程只是从启动例程中返回,返回值是线程的退出码。(2)县城可以被同一进程中的其他线程取消。(3)线程调用 pthread_exit.4rval_prt 是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以调用 pthread_join 函数访问到这个指针。5名称:: pthread_exit功能: 终止一个线程头文件: #include 函数原形: void pthread_exit(void *rva

10、l_ptr);参数: 返回值: 无名称:: pthread_join功能: 获得进程的终止状态头文件: #include 函数原形: int pthread_join(pthread_t thread,void *rval_ptr);参数: 返回值: 若成功返回 0,否则返回错误编号。当一个线程通过调用 pthread_exit 退出或者简单地从启动历程中返回时,进程中的其他线程可以通过调用 pthread_join 函数获得进程的退出状态。调用pthread_join 进程将一直阻塞,直到指定的线程调用 pthread_exit,从启动例程中或者被取消。如果线程只是从它的启动历程返回,rva

11、l_ptr 将包含返回码。#include #include void *thr_fn1(void *arg)printf(“thread 1 returningn”);return(void *)1);void *thr_fn2(void *arg)printf(“thread 2 exitingn”);return(void *)2);int main()pthread_t tid1,tid2;void *tret;pthread_create(pthread_create(pthread_join(tid1,printf(“thread 1 exit code %dn”,(int)tre

12、t);pthread_join(tid2,printf(“thread 2 exit code %dn”,(int)tret);exit(0);运行结果是:thread 1 returningthread 2 exitingthread 1 exit code 1thread 2 exit code 26名称:: pthread_detach在默认情况下,线程的终止状态会保存到对该线程调用 pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回。当线程被分离时,并不能用 pthread_join 函数等待它的终止状态。对分离状态的线程进行 pthrea

13、d_join 的调用会产生失败,返回 EINVAL.pthread_detach 调用可以用于使线程进入分离状态。7在默认的情况下,pthread_cancel 函数会使由 tid 标识的线程的行为表现为如同调用了参数为 PTHEAD_CANCELED 的 pthread_exit 函数,但是,线程可以选择忽略取消方式和控制取消方式。pthread_cancel 并不等待线程终止,它仅仅提出请求。8线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。要注意的是如果线程是通过从他的启动

14、例程中返回而终止的,它的处理程序就不会调用。还要注意清理处理程序是按照与它们安装时相反的顺序调用的。功能: 使线程进入分离状态。头文件: #include 函数原形: int pthread_detach(pthread_t tid);参数: 返回值: 若成功则返回 0,否则返回错误编号。名称:: pthread_cancel功能: 取消同一进程中的其他线程头文件: #include 函数原形: int pthread_cancel(pthread_t tid);参数: tid 线程 id返回值: 若成功返回 0,否则返回错误编号。名称:: pthread_cancel_push/ pthre

15、ad_cancel_push_pop功能: 线程清理处理程序头文件: #include 函数原形: void pthread_cancel_push(void (*rtn)(void *),void *arg);void pthread_cancel_pop(int execute);参数: rtn 处理程序入口地址arg 传递给处理函数的参数返回值: 无#include #include void cleanup(void *arg)printf(“cleanup: %sn”,(char *)arg);void *thr_fn(void *arg) /*线程入口地址*/printf(“thr

16、ead startn”);pthread_cleanup_push(cleanup,”thread first handler”);/*设置第一个线程处理程序*/pthread_cleanup_push(cleanup,”thread second handler”); /*设置第二个线程处理程序*/printf(“thread push completen”);pthread_cleanup_pop(0); /*取消第一个线程处理程序 */pthread_cleanup_pop(0); /*取消第二个线程处理程序 */int main()pthread_t tid;void *tret;pt

17、hread_creat( /*创建一个线程 */pthread_join(tid, /*获得线程终止状态 */ptinrf(“thread exit code %dn”,(int)tret);八、一次性初始化有时候我们需要对一些 posix 变量只进行一次初始化,如线程键(我下面会讲到)。如果我们进行多次初始化程序就会出现错误。在传统的顺序编程中,一次性初始化经常通过使用布尔变量来管理。控制变量被静态初始化为 0,而任何依赖于初始化的代码都能测试该变量。如果变量值仍然为 0,则它能实行初始化,然后将变量置为 1。以后检查的代码将跳过初始化。但是在多线程程序设计中,事情就变的复杂的多。如果多个线

18、程并发地执行初始化序列代码,2 个线程可能发现控制变量为 0,并且都实行初始化,而该过程本该仅仅执行一次。初始化的状态必须由互斥量保护。如果我们需要对一个 posix 变量静态的初始化,可使用的方法是用一个互斥量对该变量的初始话进行控制。但有时候我们需要对该变量进行动态初始化,pthread_once 就会方便的多。9.类型为 pthread_once_t 的变量是一个控制变量。控制变量必须使用PTHREAD_ONCE_INIT 宏静态地初始化。pthread_once 函数首先检查控制变量,判断是否已经完成初始化,如果完成就简单地返回;否则,pthread_once 调用初始化函数,并且记录

19、下初始化被完成。如果在一个线程初始时,另外的线程调用 pthread_once,则调用线程等待,直到那个现成完成初始话返回。下面就是该函数的程序例子:#include pthread_once_t once=PTHREAD_ONCE_INIT;pthread_mutex_t mutex; /*互斥量,我们后面会讲到 */void once_init_routine(void) /* 一次初始化函数*/int status;status=pthread_mutex_init(/*初始化互斥量*/if(status=0)printf(“Init success!,My id is %u”,pthr

20、ead_self();void *child_thread(void *arg)printf(“Im child ,My id is %u”,pthread_self();pthread_once( /*子线程调用一次性初始化函数*/int main(int argc,char *argv )pthread_t child_thread_id;pthread_create(/*创建子线程*/名称: pthread_once功能: 一次性初始化头文件: #include 函数原形: pthread_once_t once_control=PTHREAD_ONCE_INIT;int pthread

21、_once(pthread_once_t *once_control,void(*init_routine)(void);参数: once_control 控制变量init_routine 初始化函数返回值: 若成功返回 0,若失败返回错误编号。printf(“Im father,my id is %u”,pthread_self();pthread_once(/*父线程调用一次性初始化函数*/pthread_join(child_thread_id,NULL);程序运行结果如下:./onceIm father,My id is 3086874304Init success!,My id is

22、 3086874304Im child, My id is 3086871472 从上面的结果可以看到当主函数初始化成功后,子函数初始化失败。九、线程的私有数据在进程内的所有线程共享相同的地址空间,任何声明为静态或外部的变量,或在进程堆声明的变量,都可以被进程所有的线程读写。那怎样才能使线程序拥有自己的私有数据呢。posix 提供了一种方法,创建线程键。10.第一个参数为指向一个键值的指针,第二个参数指明了一个 destructor 函数(清理函数),如果这个参数不为空,那么当每个线程结束时,系统将调用这个函数来释放绑定在这个键上的内存块。这个函数常和函数 pthread_once 一起使用,

23、为了让这个键只被创建一次。函数 pthread_once 声明一个初始化函数,第一次调用 pthread_once 时它执行这个函数,以后的调用将被它忽略。下面是程序例子:#include pthread_key_t tsd_key;pthread_once_t key_once=PTHREAD_ONCE_INIT;void once_routine(void)int status;status=pthread_key_create(/*初始化线程私有数据键*/名称:: pthread_key_create功能: 建立线程私有数据键头文件: #include 函数原形: int pthread

24、_key_create(pthread_key_t *key,void(*destructor)(void *);参数: key 私有数据键destructor 清理函数返回值: 若成功返回 0,若失败返回错误编号。if(status=0)printf(“Key create success! My id is %un”,pthread_self();void *child_thread(void *arg)printf(“Im child,My id is %un”,pthread_self();pthread_once(/* 调用一次性初始化函数*/int main(int argc,ch

25、ar *argv )pthread_t child_thread_id;pthread_create(printf(“Im father,my id is%un”,pthread_self();pthread_once(程序运行结果如下:Im father,My id is 3086231232Key create success! My id is 3086231232Im child,My id is 2086228400第二章 线程高级知识一线程属性线程具有属性,用 pthread_attr_t 表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用 pthrea

26、d_attr_init 函数对其初始化,用 pthread_attr_destroy 对其去除初始化。1调用 pthread_attr_init 之后,pthread_t 结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。如果要去除对 pthread_attr_t 结构的初始化,可以调用 pthread_attr_destroy函数。如果 pthread_attr_init 实现时为属性对象分配了动态内存空间,pthread_attr_destroy 还会用无效的值初始化属性对象,因此如果经名称:: pthread_attr_init/pthread_attr_destroy功能:

27、对线程属性初始化/去除初始化头文件: #include 函数原形: int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);参数: Attr 线程属性变量返回值: 若成功返回 0,若失败返回-1。pthread_attr_destroy 去除初始化之后的 pthread_attr_t 结构被 pthread_create 函数调用,将会导致其返回错误。线程属性结构如下:typedef structint detachstate; 线程的分离状态int schedpoli

28、cy; 线程调度策略struct sched_param schedparam; 线程的调度参数int inheritsched; 线程的继承性int scope; 线程的作用域size_t guardsize; 线程栈末尾的警戒缓冲区大小int stackaddr_set;void * stackaddr; 线程栈的位置size_t stacksize; 线程栈的大小pthread_attr_t;每个个属性都对应一些函数对其查看或修改。下面我们分别介绍。二、线程的分离状态线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结

29、束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以 pthread_attr_t 结构中的 detachstate 线程属性,让线程以分离状态启动。2可以使用 pthread_attr_setdetachstate 函数把线程属性 detachstate 设置为下面的两个合法值之一:设置为 PTHREAD_CREATE_DETACHED,以分

30、离状态启动线程;或者设置为 PTHREAD_CREATE_JOINABLE,正常启动线程。可以使用pthread_attr_getdetachstate 函数获取当前的 datachstate 线程属性。名称:: pthread_attr_getdetachstate/pthread_attr_setdetachstate功能: 获取/修改线程的分离状态属性头文件: #include 函数原形: int pthread_attr_getdetachstate(const pthread_attr_t * attr,int *detachstate);int pthread_attr_setde

31、tachstate(pthread_attr_t *attr,int detachstate);参数: Attr 线程属性变量Detachstate 线程的分离状态属性返回值: 若成功返回 0,若失败返回-1。以分离状态创建线程#iinclude void *child_thread(void *arg)printf(“child thread run!n”);int main(int argc,char *argv )pthread_t tid;pthread_attr_t attr;pthread_attr_init(pthread_attr_setdetachstate(pthread_

32、create(pthread_attr_destroy(sleep(1);三、线程的继承性函数 pthread_attr_setinheritsched 和 pthread_attr_getinheritsched 分别用来设置和得到线程的继承性,这两个函数的定义如下:3.这两个函数具有两个参数,第 1 个是指向属性对象的指针,第 2 个是继承性或指向继承性的指针。继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy 和 schedparam 属性中显式设置的调度信息。Pthreads 不为inheritsched 指定默认值,因此如果你关心线程的调度策略和参数,必须先设置

33、该属性。名称:: pthread_attr_getinheritschedpthread_attr_setinheritsched功能: 获得/设置线程的继承性头文件: #include 函数原形: Int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);参数: attr 线程属性变量inheritsched 线程的继承性返回值: 若成功返回 0,若失

34、败返回-1。继承性的可能值是 PTHREAD_INHERIT_SCHED(表示新线程将继承创建线程的调度策略和参数)和 PTHREAD_EXPLICIT_SCHED(表示使用在schedpolicy 和 schedparam 属性中显式设置的调度策略和参数)。如果你需要显式的设置一个线程的调度策略或参数,那么你必须在设置之前将 inheritsched 属性设置为 PTHREAD_EXPLICIT_SCHED.下面我来讲进程的调度策略和调度参数。我会结合下面的函数给出本函数的程序例子。四、线程的调度策略函数 pthread_attr_setschedpolicy 和 pthread_attr_

35、getschedpolicy 分别用来设置和得到线程的调度策略。4.这两个函数具有两个参数,第 1 个参数是指向属性对象的指针,第 2 个参数是调度策略或指向调度策略的指针。调度策略可能的值是先进先出(SCHED_FIFO)、轮转法(SCHED_RR),或其它(SCHED_OTHER)。SCHED_FIFO 策略允许一个线程运行直到有更高优先级的线程准备好,或者直到它自愿阻塞自己。在 SCHED_FIFO 调度策略下,当有一个线程准备好时,除非有平等或更高优先级的线程已经在运行,否则它会很快开始执行。SCHED_RR(轮循) 策略是基本相同的,不同之处在于:如果有一个SCHED_RR策略的线程

36、执行了超过一个固定的时期(时间片间隔)没有阻塞,而另外的SCHED_RR 或 SCHBD_FIPO 策略的相同优先级的线程准备好时,运行的线程将被抢占以便准备好的线程可以执行。当有 SCHED_FIFO 或 SCHED_RR 策赂的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的SCHED_FIFO 线程和一个高优先织的 SCHED_FIFO 线程都在等待锁相同的互斥且,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。五、线程的调度参数函数 pthread_attr_getschedparam 和 pthread_attr_setsche

37、dparam 分别用来设置和得到线程的调度参数。名称:: pthread_attr_getschedpolicypthread_attr_setschedpolicy功能: 获得/设置线程的调度策略头文件: #include 函数原形: int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);参数: attr 线程属性变量policy 调度策略返回值: 若成功返回 0,若失败返回

38、-1。5.这两个函数具有两个参数,第 1 个参数是指向属性对象的指针,第 2 个参数是sched_param 结构或指向该结构的指针。结构 sched_param 在文件/usr/include /bits/sched.h 中定义如下:struct sched_paramint sched_priority;结构 sched_param 的子成员 sched_priority 控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用sched_get_priority_max 函数和 sched_get_priority_min 函数分别得到。注意:如果不是编写实时程序

39、,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。6.名称:: pthread_attr_getschedparampthread_attr_setschedparam功能: 获得/设置线程的调度参数头文件: #include 函数原形: int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread_attr_setsc

40、hedparam(pthread_attr_t *attr,const struct sched_param *param);参数: attr 线程属性变量param sched_param 结构返回值: 若成功返回 0,若失败返回-1。名称:: sched_get_priority_maxsched_get_priority_min功能: 获得系统支持的线程优先权的最大和最小值头文件: #include 函数原形: int sched_get_priority_max(int policy);int sched_get_priority_min(int policy);参数: policy

41、系统支持的线程优先权的最大和最小值返回值: 若成功返回 0,若失败返回-1。下面是上面几个函数的程序例子:#include #include void *child_thread(void *arg)int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init( /*初始化线程属性变量*/pthread_attr_setinheritsched( /*设置线程继承性*/pthread_attr_getinheritsched( /*获得线程的继承性

42、*/if(policy=PTHREAD_EXPLICIT_SCHED)printf(“Inheritsched:PTHREAD_EXPLICIT_SCHEDn”);if(policy=PTHREAD_INHERIT_SCHED)printf(“Inheritsched:PTHREAD_INHERIT_SCHEDn”);pthread_attr_setschedpolicy(/*设置线程调度策略*/pthread_attr_getschedpolicy(/*取得线程的调度策略*/if(policy=SCHED_FIFO)printf(“Schedpolicy:SCHED_FIFOn”);if(p

43、olicy=SCHED_RR)printf(“Schedpolicy:SCHED_RRn”);if(policy=SCHED_OTHER)printf(“Schedpolicy:SCHED_OTHERn”);sched_get_priority_max(max_priority);/*获得系统支持的线程优先权的最大值*/sched_get_priority_min(min_priority);/* 获得系统支持的线程优先权的最小值*/printf(“Max priority:%un”,max_priority);printf(“Min priority:%un”,min_priority);p

44、aram.sched_priority=max_priority;pthread_attr_setschedparam(/*设置线程的调度参数 */printf(“sched_priority:%un”,param.sched_priority);/*获得线程的调度参数*/pthread_attr_destroy(int main(int argc,char *argv )pthread_t child_thread_id;pthread_create(pthread_join(child_thread_id,NULL);六、线程的作用域函数 pthread_attr_setscope 和 p

45、thread_attr_getscope 分别用来设置和得到线程的作用域,这两个函数的定义如下:7这两个函数具有两个参数,第 1 个是指向属性对象的指针,第 2 个是作用域或指向作用域的指针,作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是 PTHREAD_SCOPE_PROCESS(进程内竞争资源)PTHREAD_SCOPE_SYSTEM.(系统级上竞争资源)。七、线程堆栈的大小函数 pthread_attr_setstacksize 和 pthread_attr_getstacksize 分别用来设置和得到线程堆栈的大小,这两个函数的定义如下所示:8名称:: pthread_at

46、tr_setscopepthread_attr_getscope功能: 获得/设置线程的作用域头文件: #include 函数原形: int pthread_attr_setscope(pthread_attr_t *attr,int scope);int pthread_attr_getscope(const pthread_attr_t *attr,int *scope);参数: attr 线程属性变量scope 线程的作用域返回值: 若成功返回 0,若失败返回-1。名称:: pthread_attr_getdetstacksizepthread_attr_setstacksize功能:

47、获得/修改线程栈的大小头文件: #include 函数原形: int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);这两个参数具有两个参数,第 1 个是指向属性对象的指针,第 2 个是堆栈大小或指向堆栈大小的指针如果希望改变栈的默认大小,但又不想自己处理线程栈的分配问题,这时使用 pthread_attr_setstack

48、size 函数就非常用用。八、线程堆栈的地址函数 pthread_attr_setstackaddr 和 pthread_attr_getstackaddr 分别用来设置和得到线程堆栈的位置,这两个函数的定义如下:9.这两个函数具有两个参数,第 1 个是指向属性对象的指针,第 2 个是堆栈地址或指向堆栈地址的指针。参数: attr 线程属性变量stacksize 堆栈大小 返回值: 若成功返回 0,若失败返回-1。名称:: pthread_attr_setstackaddrpthread_attr_getstackaddr功能: 获得/修改线程栈的位置头文件: #include 函数原形: int pthread_attr_getstackaddr(const pthread_attr_t *attr,void *stackaddf);int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);参数: attr 线程属性变量stackaddr 堆栈地址返回值: 若成功返回 0,若失败返回-1。九、线程栈末尾的警戒缓冲区大小函数 pthread_attr_getguardsize 和 pthread_attr_setguards

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 说明文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报