12 Thread Control
1 Thread Limits
用sysconf函数可以获得和thread相关的一些系统信息,主要是线程相关的一些最大值:
NAME |
Description |
Argument |
PTHREAD_DESTRUCTOR_ITERATIONS |
最大尝试销毁线程相关数据(Thread Specific Data)的次数,见下面关于Thread-Specific Data的内容 |
_SC_THREAD_DESTRUCTOR_ITERATIONS |
PTHREAD_KEYS_MAX |
一个进程所能够创建的最大键数 |
_SC_THREAD_KEYS_MAX |
PTHREAD_STACK_MIN |
线程栈的最小值 |
_SC_THREAD_STACK_MIN |
PTHREAD_THREADS_MAX |
单个进程中的线程个数最大值 |
_SC_THREAD_THREADS_MAX |
部分概念在后面会提到。
虽然标准定义了这些常量,不过在很多系统上面可能根本就没有定义对应的Argument(如_SC_THREAD_DESTRUCTOR_ITERATIONS可能未定义),或者sysconf函数返回错误。因此在很多时候这些很难派上用场。
2 Thread Attributes
在前面讲到pthread_create等函数的时候,这些函数有一个参数pthread_attr_t。缺省情况下可以传NULL。但是如果想自己定义线程的相关属性的话,应该调用pthread_attr_init函数来定义:
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
返回0表示正常,出错时返回错误值 |
pthread_attr_init函数负责初始化pthread_attr_t结构为缺省值。pthread_attr_destroy负责释放在pthread_attr_init函数调用时分配的内存,同时将pthread_attr的内容置为非法。如果要修改属性,需要调用其他函数来手动设置。
基本的线程属性如下:
Name |
Description |
detachstate |
detached状态,在前一章中有讲述 |
guardsize |
线程栈底部的Guard缓冲区的大小 |
stackadddr |
线程栈的最低地址 |
stacksize |
线程栈的大小 |
1. Detached State:一个线程如果出于Detached状态,说明此线程在退出的时候可以立刻释放其资源和对应的结束代码,从而无法使用pthread_join。可以用pthread_attr_setdetachedstate函数来设置Detach状态。传入PTHREAD_CREATE_DETACHED可以让线程启动的时候就处于Detached状态,而传入PTHREAD_CREATE_JOINABLE则是以通常状态启动线程
#include <pthread.h>
int pthread_attr_getdetachedstate(const pthread_attr_t *restrict attr, int *detachstate);
int pthread_attr_setdetachedstate(pthread_attr_t *restrict attr, int detachstate);
返回0表示正常,出错时返回错误值 |
2. GuardSize:在线程栈的末尾有一个比较小的内存区域,这个内存区域是保护起来的,一旦栈发生overflow,系统立刻就会知道,发送一个Signal(Windows也有类似的功能,只不过是用于自动增长栈的大小)。缺省情况下这个大小正好是一个页=PAGESIZE。甚至可以用函数将该数值设置为0