3

pthread_createの最初の引数は、pthread_tポインターです。以下のhelloプログラムpthread_t*で、最初の引数がpthread_t( )ではなくpthread_t()へのポインターである場合、プログラムは...pthread_tで終了します。なぜですか?Segmentation fault

pthread_t*の最初の引数の宣言された型として見たのを覚えていませんpthread_createそして、Butenhofの本Programming
withPOSIXThreadsの第2章は次のように述べています。

pthread_tスレッドを作成するには、 [not pthread_t*]型の変数を宣言する必要があります。

しかし、仕様によれば、の最初の引数pthread_createはへのポインタです。それではpthread_t、なぜセグメンテーション違反が発生するのでしょうか。



セグメンテーション違反

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);



正常に実行

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);



こんにちはプログラム:

#include <pthread.h>
#include <stdio.h>

void * 
hello(void *arg){
  printf("Hello\n");
  pthread_exit(NULL);
}

int 
main(int argc, char **argv){
  pthread_t thr = 1;
  pthread_create(&thr, NULL, &hello, NULL);



  pthread_join(thr, NULL);

  return 0;
}

pthread_createプロトタイプ:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
4

3 に答える 3

9
pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);

pthread_tストレージを割り当てずにへのポインタを宣言します。を呼び出すとpthread_create、に書き込みを試みます*thr。これは未定義の場所にあり、ほぼ確実に失敗します。

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);

のストレージ(thrスタック上)を宣言しているため、機能しpthread_tます。

2番目の動作中のバージョンは、helloプログラムで使用されるバージョンに簡略化できることに注意してください。

pthread_t thr;
pthread_create(&thr, NULL, &hello, NULL);

...これはスタック上でaを宣言し、pthread_tそれへのポインタを。に渡しますpthread_create

于 2012-12-19T16:03:02.813 に答える
4

これは、ポインタを宣言するだけでは、割り当てられた初期化されたメモリを指すとは期待できないためです。

代わりにを宣言するpthread_tと、独自の小さなメモリブロックが割り当てられ、&演算子を使用してアドレスを取得し、に渡すことができpthread_createます。

于 2012-12-19T16:03:54.717 に答える
0

スレッドを作成する場合は、以下のコードを使用できます。

pthread_t* thread_handles;
thread_handles = malloc(thread_count * sizeof(pthread_t));
for (thread = 0; thread < thread_count; thread++)
{
  pthread_create(&thread_handles[thread], NULL, threadFunc, (void*)input);
}

このようにpthread_create、呼び出す前にハンドルにメモリを割り当てる必要があります。「構造体」を作成する場合と同様に、最初にハンドルにメモリを割り当てる必要があります。

于 2016-05-22T11:13:57.843 に答える