pthread_attr_setstack(3C) 可以设置线程栈地址和大小。
int pthread_attr_setstack(pthread_attr_t *tattr,void *stackaddr, size_t stacksize);
#include <pthread.h> pthread_attr_t tattr; void *base; size_t size; int ret; base = (void *) malloc(PTHREAD_STACK_MIN + 0x4000); /* setting a new address and size */ ret = pthread_attr_setstack(&tattr, base,PTHREAD_STACK_MIN + 0x4000);
stackaddr 属性定义线程栈的基准(低位地址)。stacksize 属性指定栈的大小。如果将 stackaddr 设置为非空值,而不是缺省的 NULL,则系统将在该地址初始化栈,假设大小为 stacksize。
base 包含新线程使用的栈的地址。如果 base 为 NULL,则 pthread_create(3C) 将为大小至少为 stacksize 字节的新线程分配栈。
pthread_attr_setstack() 成功完成后将返回零。其他任何返回值都表示出现了错误。如果出现以下情况,该函数将失败并返回对应的值。
EINVAL
描述:base 或 tattr 的值不正确。stacksize 的值小于 PTHREAD_STACK_MIN。
以下示例说明如何使用自定义栈地址和大小来创建线程。
#include <pthread.h> pthread_attr_t tattr; pthread_t tid; int ret; void *stackbase; size_t size; /* initialized with default attributes */ ret = pthread_attr_init(&tattr); /* setting the base address and size of the stack */ ret = pthread_attr_setstack(&tattr, stackbase,size); /* address and size specified */ ret = pthread_create(&tid, &tattr, func, arg);