2016-04-14 4 views
0

最近スレッドを使用し始めました。嫌いなことはありません.iは、コマンドラインから提供される制限Nまで素数を計算するプログラムに取り組んでいました。pthread_create/segmentation faultへの未定義の参照

私はこのNをnum_threadsに分配します。つまり、数字は40、num_threads = 4とすると、各スレッドは10個のインデックスを取得する必要があります.iは各スレッドの上限と下限を含む構造体を作成しました。この構造の "高"と "低"属性を使用してフローを制御しました。

あなたの誰もが間違いを指摘したり、これは私はかなり感謝される行うには正しいことであるなら、私に伝えることができproblem.ifのいくつかの種類があるようです:)

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); 
} 
+0

あなたは 'fml * x;'を宣言しますが、それを使う前にメモリを割り当てないでください(あるいはポインタ 'x'に何かを割り当てる)。 –

+0

'g ++ -O0 -g prime5000.cpp -lpthread -o 5prime'でコンパイルし、' gdb。/ 5prime'を使ってデバッグすることができます。この問題は、デバッガの最初の数ステップで表示されます。 –

+0

コンパイラ呼び出しの '-lpthread'を' -pthread'で置き換えます。また、 '&x'を' fml ** 'である' pthread_create() 'に渡していますが、' void() 'を' fml * 'に' calc() 'しています。また、ラドン以外の非アトミックなメモリを同期なしで共有しているため、データ競合による動作が未定義になります。 – EOF

答えて

0

-lpthreadをしようとしてだけでなく、後に問題がまだ(持続し、また、代わりにポインタが、同じ問題sadly.segmentation障害のクラスのオブジェクトを渡す試してみました-pthreadコアダンプ)は多くの情報を提供しません

関連する問題