0

可能重复:
在 linux 中未定义对 pthread_create 的引用(c 编程)

我正在尝试在 C 中在 Ubuntu 中实现线程链。当我编译以下代码时,即使我添加了头文件,我也会收到对这些线程库函数的未定义引用的错误。我也收到分段错误错误。这是为什么?我没有在程序的任何地方访问一些未初始化的内存。这是代码:

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

void* CreateChain(int*);

 int main()
{
int num;

pthread_t tid;


scanf("Enter the number of threads to create\n %d",&num);

pthread_create(&tid,NULL,CreateChain,&num);

pthread_join(tid,NULL);

printf("Thread No. %d is terminated\n",num);

return 0;
}

void* CreateChain(int* num )
 {
pthread_t tid;

if(num>0)
{
    pthread(&tid,NULL,CreateChain,num);
    pthread_join(tid,NULL);

    printf("Thread No. %d is terminated\n",*num);
}
else
    return NULL; 

return NULL;
}

我收到以下警告,并且由于某种原因没有出现 Scanf 提示。

在此处输入图像描述

问候

4

3 回答 3

2

pthread.h 头文件提供了 pthread 函数的前向声明。这告诉编译器这些函数存在并且具有一定的签名。然而,它并没有告诉链接器在运行时在哪里可以找到这些函数。

要允许链接器解析这些调用(决定在代码内部或不同的共享对象中跳转到哪里),您需要通过添加链接到适当的(pthread)库

-pthread

到您的构建命令行。

[请注意,也可以使用-lpthread. 上一个问题解释了为什么-pthread更可取。]

代码还有其他各种值得关注的问题

  • scanf行应拆分为printf("Enter number of threads\n");scanf("%d", &num);显示用户提示
  • 的签名CreateChain是错误的——它应该void*取而代之的是一个参数。您始终可以int num = *(int*)arg;在函数内部执行类似操作来检索线程数。
  • 里面的逻辑CreateChain看起来不对。您目前将指针与 0 进行比较 - 我想您的意思是比较线程数?此外,如果您不减少要在某处创建的线程数,您最终会得到永远创建线程的代码(或者直到您用完句柄,具体取决于不同线程的调度方式)。
于 2012-12-04T15:44:16.113 回答
1

尝试像下面这样编译:

gcc -Wall -pthread test.c -o test.out

-pthread是一个选项,可以明确告诉链接器解析与<pthread.h>

于 2012-12-04T15:44:24.147 回答
0

添加-lpthread

gcc -o test test.c -lpthread
于 2012-12-04T15:45:58.097 回答