set_stack.c
关键词:线程堆栈
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NTHREADS 8
#define ARRAY_SIZE 1000 * 1000
void *Hello(void *threadid)
{
double A[ARRAY_SIZE];
int i;
long tid;
tid = (long)threadid;
sleep(3);
for (i=0; i<ARRAY_SIZE; i++)
{
A[i] = i * 1.0;
}
printf("%ld: Hello World! %f\n", tid, A[ARRAY_SIZE-1]);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NTHREADS];
size_t stacksize;
pthread_attr_t attr;
int rc;
long t;
pthread_attr_init(&attr);
pthread_attr_getstacksize (&attr, &stacksize);
printf("Thread stack size = %li bytes (hint, hint)\n",stacksize);
// pthread_attr_setstacksize(&attr, 1000 * 2024 * 8);
// pthread_attr_getstacksize (&attr, &stacksize);
// printf("Thread stack size = %li bytes (hint, hint)\n",stacksize);
for(t=0;t<NTHREADS;t++){
rc = pthread_create(&threads[t], NULL, Hello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
printf("Created %ld threads.\n", t);
pthread_exit(NULL);
}
上述代码执行会报错,其原因在于子线程中临时变量数组A[]的大小超出了线程默认的堆栈大小,即我们调用pthread_attr_getstacksize()获得的堆栈信息。
一种修改方法如注释的代码所示,可以使用pthread_attr_setstacksize()重新设置线程堆栈,使其满足使用要求。
当然实际代码中不推荐在线程中申请过大的临时变量(占用栈空间),如果有使用需求建议使用系统函数(malloc等)从进程的堆上分配空间,即double* A = (double*)malloc(sizeof(double) * ARRAY_SIZE),使用完毕后再释放。