0

我正在尝试 Tanenbaum 的 3e“现代操作系统”中的代码,但出现编译器错误和警告:

$ 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。在这种情况下,不要在 main 函数中使用 exit 语句,因为 main 可能会退出并且您的线程也将终止,并且您可能无法在线程函数中获得 print 语句的输出。

PL。在 main 中使用 pthread_exit 而不是 exit ,这样即使您的主线程终止,其他线程也可以继续。

于 2012-07-17T05:40:08.063 回答