【问题标题】:undefined reference to pthread_create/segmentation fault对 pthread_create/segmentation 错误的未定义引用
【发布时间】:2016-04-14 22:11:57
【问题描述】:

我最近开始使用线程,所以对这些东西很陌生。请不要讨厌。我正在开发一个程序,该程序将计算素数直到通过命令行提供的限制 N。

我会将这个 N 分配给 num_threads 即 4 .let 说数字是 40 并且 num_threads=4 然后每个线程应该获得 10 个索引。我创建了一个包含每个线程的上限和下限的结构。我传递了一个指针这个结构,并使用这个结构的“高”和“低”属性来控制流量。

似乎有某种问题。如果你们中的任何人能指出错误或告诉我这样做是否正确,我将不胜感激:)

geany 给出以下错误:

g++ -Wall -o "prime5000" "prime5000.cpp" (in directory: /home/jarrar/operating systems/threads)
/tmp/ccAHGsIw.o: In function `main':
prime5000.cpp:(.text+0xc9): undefined reference to `pthread_create'
prime5000.cpp:(.text+0xf6): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
Compilation failed.

如果使用以下命令从终端执行:

g++ prime5000.cpp -lpthread -o 5prime
./5prime

它会给:

分段错误(核心转储)

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#define num_thread 4
void* calc(void* param);

struct fml
{
long low;
long high;
};
fml* x;
int main(int argc,char* argv[])
{
    pthread_t threadArray[num_thread];
    int thread;


for(thread=0;thread<num_thread;thread++)
{   

    x->low=thread*atoi(argv[1])/num_thread;
    x->high=x->low+(thread+1)*atoi(argv[1])/num_thread;

    pthread_create(&threadArray[thread],NULL,calc,&x);
}
int i;
for(i=0;i<num_thread;i++)
{
    pthread_join(threadArray[i],NULL);
}

return 0;
}

void* calc(void* param)
{
    fml* temp=(fml*)param;

    long lowerLimit=temp->low;
    long upperLimit=temp->high;
    int i;
    int j;

    for(i=lowerLimit;i<upperLimit;i++)
    {
        for(j=2;j<i;j++)
        {   if(i!=1||i!=0)
            {
                if(!(i%j==0))
                {
                    printf("%d ",i);
                }
            }
        }
    }
    pthread_exit(NULL);
}

【问题讨论】:

  • 您声明了fml* x;,但在使用它之前从未为其分配任何内存(或为指针x分配任何内容)。
  • 使用g++ -O0 -g prime5000.cpp -lpthread -o 5prime编译,你可以使用gdb ./5prime进行调试。这个问题会在调试器的前几个步骤中出现。
  • 将编译器调用中的-lpthread 替换为-pthread。此外,您将&amp;x 传递给pthread_create(),这是一个fml **,但是您将calc() 中的void* 转换为fml*,这是不正确的。此外,您在没有同步的情况下共享非 radonly、非原子内存,这会导致由于数据竞争而导致的未定义行为。

标签: multithreading pthreads


【解决方案1】:

在尝试了 -lpthread 和 -pthread 之后,问题仍然存在,并且还尝试传递类的对象而不是指针,但同样的问题很遗憾。分段错误(核心转储)没有提供很多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多