【问题标题】:Cannot compile multi-threading example in C无法在 C 中编译多线程示例
【发布时间】:2017-02-20 18:47:38
【问题描述】:

在尝试为学校做一个多线程项目时遇到一个重大问题

我只是想运行示例代码来看看 pthread 是如何工作的

 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
 int sum;
 void *runner(void *param);
 int main(int argc, char *argv[]) {     
     pthread_t tid;
     pthread_attr_t attr;

     if (argc !=2){
         fprintf(stderr, "usage: a.out <interger value>\n");
         return -1;
     }
     if (atoi(argv[1]) < 0) {
         fprintf(stderr, "%d must be >= 0\n",atoi(argv[1]));
         return -1;
     }
     pthread_attr_init(&attr);//get default attributes
     pthread_create(&tid,&attr,runner,argv[1]);//create the thread
     pthread_join(tid,NULL);//wait for the thread to exit
     printf("sum = %d\n",sum);
 }

 void *runner(void *param) {
     int i, upper = atoi(param);
     sum = 0;
     for (i =1; i <= upper; i++) {
         sum += i;
     } 
     pthread_exit(0);
 }

无论我做什么,我都无法编译代码。我收到以下错误:

运行“/home/ubuntu/workspace/primefactor/assn3.c” /tmp/cc58AE5c.o:在函数“主”中: assn3.c:(.text+0xc4): 未定义对“pthread_create”的引用 assn3.c:(.text+0xd5): 未定义对“pthread_join”的引用 collect2:错误:ld 返回 1 个退出状态 进程退出,代码:1

我尝试使用 -pthread 标志编写自己的 makefile;没用…… 我试过跑步

sudo apt-get install libpthread-stubs0-dev

安装正确的库;没用...

我竭尽全力尝试让 pthreads_create() 和 pthreads_join() 工作,它们是我学校项目的主要要求。我已经让项目使用普通的 C 程序工作(从命令行获取数字,获取每个 arg 的素数,将它们存储在一个数组中,然后传递该数组并显示结果。例如:./prime. co {1..100} 将从 BASH 运行,其输出为 1:1 2:2 3:3 4:2 2 等... 所以这就是输出应该是的,我应该用线程来做到这一点,但如果我什至不能编译示例代码来查看线程是如何工作的,我就不能这样做。

我确实已经花了几个小时搜索、尝试,但是没有运气摆脱 pthread_create() 和 pthread_join() 的这些未定义的引用错误。任何帮助都将不胜感激,以找出我收到上述错误的原因。

编辑:

感谢那些尝试为我回答的人。我不知道为什么我投了反对票;我在这里不是很活跃,在寻求帮助时我会尽量保持礼貌。不管怎样,我终于想通了。

如果我使用 make 文件,它必须如下所示:

assn3:
    gcc -g -Wall -pthread assn3.c -o assn3

然后从命令行:make assn3

【问题讨论】:

  • 编译和链接时可能需要使用-pthread 选项。
  • 我试过的东西:makefile all: gcc -Wall -O3 -pedantic-errors -D_REENTRANT -lpthread assn3.c -o assn3 all: gcc -g -Wall -pthread assn3.c assn3

标签: c multithreading pthreads


【解决方案1】:

您似乎没有向链接器指定线程库。对于多线程应用程序,gcc 的常用选项如下(假设您的程序文件名为 thread1.c):

gcc -D_REENTRANT  -lpthread  thread1.c   -o thread1

还建议使用-Wall -O3 -pedantic-errors迂腐了解编译器警告等。所以应该这样做:

gcc -Wall -O3 -pedantic-errors -D_REENTRANT  -lpthread  thread1.c   -o thread1

【讨论】:

  • makefile: 'all: gcc -Wall -O3 -pedantic-errors -D_REENTRANT -lpthread assn3.c -o assn3'
  • 推荐使用-pthread 而不是-lpthread。这还将为您定义_REENTRANT,以及线程所需的任何其他内容。它更便携。