0

Tanenbaumの3e「ModernOperatingSystems」のコードを試していますが、コンパイラエラーと警告が表示されます。

$ LANG=en_US.UTF-8 cc thread.c 
thread.c: In function ‘main’:
thread.c:19:63: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
thread.c:25:1: warning: passing argument 1 of ‘exit’ makes integer from pointer without a cast [enabled by default]
/usr/include/stdlib.h:544:13: note: expected ‘int’ but argument is of type ‘void *’
/tmp/ccqxmMgE.o: In function `main':
thread.c:(.text+0x57): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

これは私が試しているコードです

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

#define NUMBER_OF_THREADS   10

void *print_hello_world(void *tid)
{
  //printf("Hello World. Greetings from thread %d0", tid);
  pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
  pthread_t threads[NUMBER_OF_THREADS];
  int status, i;

  for(i=0; i<NUMBER_OF_THREADS; i++) {
  //printf("Main here creating thread %d0", i);
  status = pthread_create(&threads[i], NULL, print_hello_world, (void *)i);

  if (status != 0) {
    //printf("Oops. pthread_create returned error code %d0", status);
    exit(-1);
  }
}
exit(NULL);
}

コードが実行されるようにコードの状態を改善するのを手伝ってもらえますか?本の正確なコードがコンパイルされないため、正誤表があるようです。ありがとう

4

4 に答える 4

2

リンカに -lpthread オプションを指定して、pthread ライブラリにリンクしてください。

また、pthread_joinを使用して、作成されたすべてのスレッドが完了するまで待機する必要があります。

于 2012-07-17T05:33:14.073 に答える
1
$gcc thread.c -lpthread


これは、pthread 共有ライブラリをリンクするためのものです。

于 2012-07-17T05:34:35.257 に答える
1

1) リンカー エラーを取り除くには、libpthread にリンクする必要があります。

gcc ..... -lpthread

(-lpthread オプションは最後に指定する必要があることに注意してください)!

2)exit(NULL);間違っています。NULL はポインター型用ですが、 exit は int を指定する必要があります。簡単に使う

exit(0);

代わりは。

他の警告は、システムに依存するポインターと整数サイズの警告です。ほとんどの場合、安全に無視できます。

于 2012-07-17T05:38:28.963 に答える
1

Pl。この場合、メイン関数で exit ステートメントを使用しないでください。メインが終了し、スレッドも終了し、スレッド関数で print ステートメントの出力を取得できない可能性があるためです。

Pl。main で exit の代わりに pthread_exit を使用して、メイン スレッドが終了しても他のスレッドが続行できるようにします。

于 2012-07-17T05:40:08.063 に答える