当前位置:嗨网首页>书籍在线阅读

02-线程栈

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

33.1 线程栈

创建线程时,每个线程都有一个属于自己的线程栈,且大小固定。在Linux/x86-32架构上,除主线程外的所有线程,其栈的缺省大小均为2MB。(在一些64位架构下,默认尺寸要大一些,例如,IA-64有32MB。)为了应对栈的增长(参考图29-1),主线程栈的空间要大出许多。

偶尔,也需要改变线程栈的大小。在通过线程属性对象创建线程时,调用函数pthread_attr_setstacksize()所设置的线程属性(29.8节)决定了线程栈的大小。而使用与之相关的另一函数pthread_attr_setstack(),可以同时控制线程栈的大小和位置,不过设置栈的地址将降低程序的可移植性。手册页(manual page)提供了对这些函数的具体说明。

更大的线程栈可以容纳大型的自动变量或者深度的嵌套函数调用(也许是递归调用),这是改变每个线程栈大小的原因之一。而另一方面,应用程序可能希望减小每个线程栈,以便进程可以创建更多的线程。例如,在 x86-32 系统中,用户(模式)可访问的虚拟地址空间是3GB,而2MB的缺省栈大小则意味着最多只能创建 1500 个线程。(更为准确的最大值还视乎文本段、数据段、共享函数库等对虚拟内存的消耗量。)特定架构的系统上,可采用的线程栈大小最小值可以通过调用sysconf(_SC_THREAD_STACK_MION)来确定。在Linux/x86-32上的NPTL实现中,该调用返回16384。

在NPTL线程实现中,如果对线程栈尺寸资源限制(RLIMIT_STACK)的设置不同于unlimited,那么创建线程时会以其作为默认值。对该限制的设置必须在运行程序之前,通常通过执行shell内建命令ulimit–s完成(在C shell下命令为limit stacksize)。在主程序中调用setrlimit()来设置限制的办法可能行不通,因为NPTL在调用main()之前的运行时初始化期间就已经确定了默认的栈大小。