线程的栈是线程的私有数据,这部分内容是不共享的。在一个进程内有多个线程,这些线程都有自己的栈,但是又都要挤在进程的虚拟地址空间内。线程之间的栈内存必须保证彼此不冲突线程才能正确地运行。因此,虽然大多数情况下,由系统为用户设置和线程的栈内存,但有些时候还是需要用户亲自对线程进行设置。
线程基本属性中和线程栈有关的属性有三个,分别是线程栈的大小、线程栈的最低地址和线程栈末尾警戒区的大小。
系统默认为一个新建的线程提供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. void* thread()
7. {
8. pthread_attr_t pattr;
9. size_t size = 0;
10. "default size:%d\n", size);
11. pthread_attr_getstacksize(&pattr, &size);
12. "current thread stack size:%d\n", size);
13. return (void*)0;
14. }
15.
16. int main()
17. {
18. pthread_t ptd;
19. thread, NULL);
20. pthread_join(ptd, NULL);
21. "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:用于终止指定线程的执行。