2

新しいものを作成し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

スタックが逆方向に大きくなったとしても (よくわかりません)、ポインターの値が大きく異なるため、作成されたスレッドが別の仮想メモリ アドレス空間を使用することを期待するだけです。しかし、そうではないと思います。

4

1 に答える 1

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 の戻り値を確認してください。

おそらく、スタックページも整列させようとするでしょう。

于 2012-05-18T12:03:36.747 に答える