【发布时间】: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。此外,您将&x传递给pthread_create(),这是一个fml **,但是您将calc()中的void*转换为fml*,这是不正确的。此外,您在没有同步的情况下共享非 radonly、非原子内存,这会导致由于数据竞争而导致的未定义行为。