创建新的pthread
并向其传递用pthread_attr_getstack
修改的参数时,似乎没有使用已定义的堆栈空间。
void* thread_function(void * ptr)
{
int a;
printf("stack var in thread %p\n",&a);
}
int main( int argc , char **argv )
{
pthread_t thread;
void * ptr = NULL;
const int stack_size = 10*1024;
void * stack = malloc(stack_size);
printf("alloc=%p\n",&stack);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstack( &attr , stack , stack_size );
if (pthread_create(&thread, &attr, &thread_function , ptr ) ) {
printf("failed to create thread\n");
return 1;
}
pthread_attr_destroy(&attr);
pthread_exit( 0 );
return 0;
}
不幸的是输出是:
alloc=0x7fff48989bc8
stack var in thread 0x7f6e6f0d2ebc
即使堆栈向后增长(我不确定),指针值差别很大,只希望创建的线程使用不同的虚拟内存地址空间。但我认为情况并非如此。
答案 0 :(得分:3)
你打错了,
printf("alloc=%p\n",&stack);
打印本地堆栈变量的地址,而不是分配的内存。你必须这样做
printf("alloc=%p\n",stack);
此外,您需要检查错误:
错误
pthread_attr_setstack() can fail with the following error: EINVAL stacksize is less than PTHREAD_STACK_MIN (16384) bytes. On some systems, this error may also occur if stackaddr or stackaddr + stacksize is not suitably aligned.
您只设置了10kB的堆栈,因此请使用更大的堆栈再次尝试,并检查pthread_attr_setstack的返回值。
我可能会尝试使堆栈页面对齐。