c - 为什么 pthread 不使用给定的堆栈空间?

标签 c memory pthreads stack

当创建一个新的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

即使堆栈向后增长(我不确定),指针值也相差很大,只希望创建的线程使用不同的虚拟内存地址空间。但我认为事实并非如此。

最佳答案

你打印了错误的内容,

printf("alloc=%p\n",&stack);

打印局部堆栈变量的地址,而不是分配的内存。你必须做

printf("alloc=%p\n",stack);

此外,您还需要检查错误:

ERRORS

   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 的返回值。

我可能也会尝试使堆栈页面对齐。

关于c - 为什么 pthread 不使用给定的堆栈空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652226/

相关文章:

c - 我是否正确传递参数并通过引用传递?

r - 如何避免 R fisher.test 工作区错误

c - Posix线程问题

c++ - pthread_join 错误代码 3

c++ - 如何在 VS 2010 中使用 GetExtension

c - 从函数外部访问标签

c - 如何分配页面大小对齐的内存?

c - pthread 中是否可能有一个无限循环?

c++ - __func__ 未在预处理输出中替换

java - Java 中的流如何影响内存消耗?