多线程编程指南

生成自己的栈

指定线程栈大小时,必须考虑被调用函数以及每个要调用的后续函数的分配需求。需要考虑的因素应包括调用序列需求、局部变量和信息结构。

有时,您需要与缺省栈略有不同的栈。典型的情况是,线程需要的栈大小大于缺省栈大小。而不太典型的情况是,缺省大小太大。您可能正在使用不足的虚拟内存创建数千个线程,进而处理数千个缺省线程栈所需的数千兆字节的栈空间。

对栈的最大大小的限制通常较为明显,但对其最小大小的限制如何呢?必须存在足够的栈空间来处理推入栈的所有栈帧,及其局部变量等。

要获取对栈大小的绝对最小限制,请调用宏 PTHREAD_STACK_MINPTHREAD_STACK_MIN 宏将针对执行 NULL 过程的线程返回所需的栈空间量。有用的线程所需的栈大小大于最小栈大小,因此缩小栈大小时应非常谨慎。

#include <pthread.h>



pthread_attr_t tattr;

pthread_t tid;

int ret;



size_t size = PTHREAD_STACK_MIN + 0x4000;



/* initialized with default attributes */

ret = pthread_attr_init(&tattr);



/* setting the size of the stack also */

ret = pthread_attr_setstacksize(&tattr, size);



/* only size specified in tattr*/

ret = pthread_create(&tid, &tattr, start_routine, arg);