pthread (segmentation fault)
Ich bin Koreanisch und ich bin nicht gut in Englisch, aber wenn du mir einen Kommentar da unten
Ich bin sehr zufrieden und werde versuchen, es zu verstehen.
Die ich erstellt habe, z.B. 10 threads und versucht, sich Ihnen anzuschließen, die nach dem anlegen und geben den Wert zurück.
Aber wenn ich an den letzten thread, bekomme ich einen segmentation fault.
Kommt das Resultat heraus, wie diese..
Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)
wenn ich erstelle 4 threads wie
Before Thread 3 create
After Thread 3 create
Before Thread 2 create
After Thread 2 create
Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 3 join
After Thread 3 join
Before Thread 2 join
After Thread 2 join
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)
Ich kann nicht scheinen, um herauszufinden, warum.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex_lock;
struct arg_struct {
int a;
int b;
};
void *t_function(void *data) {
pthread_mutex_lock(&mutex_lock);
struct arg_struct *arg = (struct arg_struct *)data;
long int s;
s = arg->a;
pthread_mutex_unlock(&mutex_lock);
return (void **)s;
}
int main()
{
int i;
pthread_t p_thread[2];
int thr_id;
int status;
struct arg_struct arg[2];
for(i = 1; i >= 0; i--) {
arg[i].a = i;
arg[i].b = i;
}
pthread_mutex_init(&mutex_lock, NULL);
for(i = 1; i >= 0; i--) {
printf("Before Thread %d create\n", i);
thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]);
printf("After Thread %d create\n", i);
usleep(1000);
}
int temp[2];
for(i = 1; i >= 0; i--) {
printf("Before Thread %d join\n", i);
pthread_join(p_thread[i], (void**)&status);
printf("After Thread %d join\n", i);
temp[i] = status;
}i
printf("%d%d", temp[1], temp[0]);
pthread_mutex_destroy(&mutex_lock);
return 0;
}
Kann ich nicht reproduzieren, ich habe versucht, 2 und 4 threads. Es funktioniert einwandfrei, auch innerhalb von Valgrind. Können Sie uns etwas über das problem?
Haben Sie versucht, einen debugger? gdb ist dein Freund.
Willkommen ALSO. 🙂
Haben Sie versucht, einen debugger? gdb ist dein Freund.
Willkommen ALSO. 🙂
InformationsquelleAutor IKS | 2011-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen nur vergeben, Platz für zwei Elemente, die hier, so dass, wenn Sie die Einführung von mehr als 2 threads führen Sie das Ende des Arrays und potenziell Absturz oder korrupten stack.
Zusätzlich:
status
ist einint
, nicht einvoid *
; Versuch, diese wird versuchen, zu speichernvoid *
in einemint
. Auf vielen 64-bit-Plattformen, wird diese auch überlaufen (davoid *
werden 8 bytes, währendint
4). Machenstatus
einevoid *
, und aufhören zu versuchen, zu werfen compiler-Fehler wie diese. Sie sind Fehler für einen Grund.Guter Punkt, aber wir können immer noch nicht erklären, der segfault auf 2 threads obwohl.
Sie müssen code angezeigt, wo Sie geändert, diese zahlen dann, dann ist es durchaus möglich, dass Sie vergessen, sich zu ändern. Noch besser, starten Sie mit
#define
s oder eine variable zu definieren, wie viele threads zu starten, und beide Schleifen und array-Zuweisungen verwenden Sie diese variable/makro, um Inkonsistenzen zu vermeiden.Ich denke ich habe herausgefunden warum das passiert ist... ich habe 'status' als 'int', aber da bin ich mit 64-bit-Maschine ist, sollte ich wohl 'status' als 'long int'... vielleicht... ich bin mir nicht ganz sicher, aber es löst das problem für jetzt.
danke für den Tipp
InformationsquelleAutor bdonlan