比如函数执行过程中的局部变量,这些都会放在线程的栈上。每个线程都有自己的栈空间,这个大小可以通过命令 ulimit -a
查看 stack size
栏目,默认是 8192( 8MB ).
同时,我们也可以在代码中指定线程栈的大小,如下
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
主线程在内存中有一个栈空间,其他线程栈也拥有独立的栈空间。为了避免线程之间的栈空间踩踏,线程栈之间还会有小块区域( 分界符 ),用来隔离保护各自的栈空间。一旦另一个线程踏入到这个隔离区,就会引发段错误。
这一部分数据所有线程都可以访问,如全局变量,对这部份数据多线程访问,则需要加锁
线程级别,而非进程级别的全局变量,称之为线程私有数据。可以通过以下函数创建
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))
// 该函数伴随一个析构函数,对于这些变量,应当指定释放内存的方式,在线程退出时释放
key 一旦被创建,所有线程都可以访问它,但各线程可根据自己的需要往 key 中填入不同的值,这就相当于提供了一个同名而不同值的全局变量。通过如下方式进行读写
// 写
int pthread_setspecific(pthread_key_t key, const void *value)
// 读
void *pthread_getspecific(pthread_key_t key)