2016-10-06 3 views
1

Ich bin mir nicht sicher, wie Sie diesen Fehler debuggen, da es durch eine Menge Dinge verursacht werden kann. Was ich tun konnte, ist, Teile des Programms zu kommentieren und wiederholt zu kompilieren, um zu verfolgen, welcher Teil des Programms den Fehler erzeugte, und ich denke, dieser Teil erzeugt den Fehler:Segmentierungsfehler (Core Dumped) Fehler beim Erstellen von Thread

Hier möchte ich einen Thread erstellen :

int j = 0; //not the actual value, just showing that j is of type int 
pthread_create(&thread_id, NULL, strikeMultiples, (void*)j); 

Vielleicht könnte es auch durch die strikeMultiples Funktion verursacht werden, die aufgerufen wird, wenn der Thread erstellt wird:

static void* strikeMultiples(void* prime) { 
    int * primej = (int *) prime; 
    int j = *primej; 
    free (prime); 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 
+2

Unter der Annahme, 'J' ist 'int', ich bin nicht vorbei ein' int * 'auf' pthread_create', wodurch der Aufbau von 'primej' und anschließenden dereferenzieren im Thread proc ist falsch. 'int j = (int) prime;' ist näher an der Realität, aber immer noch nicht "korrekt". Um es richtig zu machen, sollten sowohl 'j' inbound als auch' j' im proc 'intptr_t' oder' uintptr_t' sein, und das 'free' sollte unabhängig davon entfernt werden. Das heißt, es ist alles Spekulation, da wir nicht wissen, welcher Typ "j" auf dem ersten Snippet ist und woher es kommt. – WhozCraig

Antwort

2

das Problem ist, dass Sie eine int auf die Funktion (Gießen zu einem Pass void *) und versuchen Sie anschließend, es als int * zu lesen.

Außerdem versuchen Sie free etwas, das nicht von malloc und Familie zurückgegeben wurde.

Übergeben Sie die Adresse des int Wert, und nicht free es in der Funktion. Außerdem ist es nicht erforderlich, zwischen einem void * und einem beliebigen Nichtfunktionszeiger zu wechseln.

static void* strikeMultiples(void* prime) { 
    int *primej = prime; 
    int j = *primej; 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 

... 

pthread_create(&thread_id, NULL, strikeMultiples, &j); 
+0

Hinweis: Es ist darauf zu achten, dass "j" im Thread-Ersteller vor der letzten Verwendung im Thread NICHT automatisch zerstört wird (außerhalb des Gültigkeitsbereichs liegt). Race Conditions, die Adressen von lokalen automatischen Variablen zur Thread-Erstellung übergeben, sind * einfach * aus Versehen und oft * schwierig * wegen ihrer sporadischen Fehler-Natur aufzuspüren. Das Übergeben von "j" an Wert wie "intptr_t" oder "unintptr_t" oder dynamischer Speicher, der von dem Thread freigegeben wird, oder eine Anzahl anderer Optionen wird dagegen schützen – WhozCraig

Verwandte Themen