【读书笔记】线程栈属性

       线程的栈是线程的私有数据,这部分内容是不共享的。在一个进程内有多个线程,这些线程都有自己的栈,但是又都要挤在进程的虚拟地址空间内。线程之间的栈内存必须保证彼此不冲突线程才能正确地运行。因此,虽然大多数情况下,由系统为用户设置和线程的栈内存,但有些时候还是需要用户亲自对线程进行设置。

        线程基本属性中和线程栈有关的属性有三个,分别是线程栈的大小、线程栈的最低地址和线程栈末尾警戒区的大小。

        系统默认为一个新建的线程提供PAGESIZE个字节的栈空间,但是很多时候需要更改此值。有时候该线程栈可能会不够用,例如,线程体函数是一个多层递归函数,该函数的特点就是需要多层嵌套栈来保存执行过程,因此,该函数可能会造成现有的栈尺寸缩小。另一中情况刚刚相反,用户进程空间的大小是固定的。如果进程内的线程太多,那么就会造成进程的虚拟地址空间不够用,这个时候减小每一个线程的栈的大小是一个必须采取的措施。

        Linux下使用pthread_attr_getstacksize函数得到栈大小属性值,pthread_attr_setstack函数设置该属性,其函数原型如下:

        #include<pthread.h>

        int pthread_attr_getstacksize(const pthtead_attr_t *restrict attr,void **restrict stackaddr,size_t *restrict stacksize)

        int pthread_attr_setstacksize(const pthread_attr_t  *attr,void *stackaddr,size_t *stacksize)

例子:

  1. #include <unistd.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <pthread.h>  
  5.   
  6. voidthread()  
  7. {  
  8.   pthread_attr_t pattr;  
  9.   size_t size = 0;  
  10.   printf("default size:%d\n", size);  
  11.   pthread_attr_getstacksize(&pattr, &size);  
  12.   printf("current thread stack size:%d\n", size);  
  13.   return (void*)0;  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.   pthread_t ptd;  
  19.   pthread_create(&ptd, NULL, thread, NULL);  
  20.   pthread_join(ptd, NULL);  
  21.   printf("main thread quit!\n");  
  22. }  

线程是提高代码响应和性能的有效手段,它类似于进程。与进程一样,线程由系统内核按时间片进行管理。在单处理系统中,系统内核使用时间片来模拟线程的并发执行。同一进程中的线程共享如下内容。

1,全局变量

2,堆数据

3,打开的文件描述符

4,当前工作目录

5,用户及用户组ID

但每个线程有自己独立的线程ID、堆栈、errno变量、优先级

       常见的线程相关的函数

1,pthread_create:创建一个进程

2,pthread_join:挂起当前线程直到所等待的线程结束

3,pthread_detach:线程分为“可联合的‘或”可分离的“。可联合的线程终止后,系统将保留其线程ID和退出状态,知道另一个线程调用pthread_jion函数。该函数将一个线程设置为“可分离”的。

4,pthread_self:返回当前线程ID

5,pthead_cancle:用于终止指定线程的执行。

原文地址:https://www.cnblogs.com/ymy124/p/2354742.html