2016-04-14 9 views
0

Ich habe vor kurzem begonnen, Threads zu verwenden, so ziemlich neu in diesem Zeug. bitte, nein, Hass. Ich arbeitete an einem Programm, das Primzahlen bis zu einer Grenze N berechnen würde, die über die Befehlszeile geliefert wird.undefined Verweis auf pthread_create/Segmentierung Fehler

ich würde dieses N an num_threads verteilen, dh 4 .lets sagen die Zahl ist 40 und num_threads = 4 dann sollte jeder Thread 10 indexes.i eine Struktur mit den oberen und unteren Grenzen für jeden thread.i einen Zeiger übergeben von dieser Struktur und verwendete die "hohen" und "niedrigen" Attribute dieser Struktur, um den Fluss zu steuern.

scheint es eine Art von problem.if jemand von euch zu sein, können Sie einen Fehler hinweisen oder mir zu sagen, ob dies die richtige Sache, die ich sein :)

geany gibt würde zu tun, ist ziemlich dankbar, die die folgenden Fehler :

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. 

vom Terminal ausgeführt, wenn sie den folgenden Befehl:

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

wird es geben:

Segmentation fault (Core Dump)

#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

Sie deklarieren 'fml * x;', aber vergeben Sie niemals Speicher dafür (oder weisen Sie dem Zeiger 'x' etwas zu), bevor Sie es verwenden. –

+0

Kompiliere mit 'g ++ -O0 -g prime5000.cpp -lpthread -o5prime' und du kannst mit' gdb./5prime' debuggen. Dieses Problem wird in den ersten Schritten eines Debuggers angezeigt. –

+0

Ersetzen Sie den '-lpthread' in der Compileraufruf mit' -Pthread'. Außerdem übergeben Sie '& x' an' pthread_create() ', was ein' fml ** 'ist, aber Sie werfen' void * 'in' calc() 'in ein' fml * ', was falsch ist. Außerdem teilen Sie nicht-radonly, nicht-atomaren Speicher ohne Synchronisierung, was zu undefiniertem Verhalten aufgrund von Datenrennen führt. – EOF

Antwort

0

nach dem Versuch, weiterhin besteht die -lpthread sowie -pthread das Problem nach wie vor und hat auch Objekt der Klasse versucht, anstelle einem Zeiger durchzulassen, aber gleiches Problem sadly.segmentation Fehler (Core Dump) liefert nicht viele Informationen