Wie bekomme ich den Fehler code aus pthread_join
Den folgenden code nicht erstellen pthreads beitreten und die Meldung "verbinden fehlgeschlagen" ausgegeben. Wie bekomme ich weitere Informationen über den Fehler und die Ursache?
pthread_t aThread[MAX_LENGTH];
int errCode[MAX_LENGTH];
char returnVal;
for(int i = 0; i < MAX_LENGTH; i++)
{
if((errCode[i] = pthread_create(&aThread[i], NULL, &findMatch, &fpArgs)) != 0)
printf("error creating thread %d\n", errCode[i]);
if(!pthread_join(aThread[i], (void**)&returnVal))
printf("join failed\n i is %d", i);
}
EDIT: tatsächlich join zurückgegeben no error
und ich habe einen Fehler gemacht. Die if-Anweisung sollten nicht den !
weil join gibt eine Zahl ungleich null, wenn es ein problem gibt, die zu true ausgewertet wird.
- Ihre Besetzung Ihrer
returnVal
- Adresse einvoid**
undefined behavior. Es sei dennsizeof(char) == sizeof(void*)
auf Ihrem system (was kann ich alles-aber-Garantie-Sie ist es nicht), das Es nicht so Aussehen, wie Sie verwenden es trotzdem, und NULL ist eine praktikable option, so können Sie eher nurpthread_join(aThread[i], NULL);
Weiterpthread_join
gibt null (0) ein Erfolg, so testen Sie es für Fehler mit!
ist Rückschritt. Schließlich wollen Sie nicht zu tun es auf diese Weise jedenfalls, den Sie starten möchten Sie alle, dann kommen Sie alle. Was Sie hier haben, ist buchstäblich kein Stück besser als single-threaded.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich wies dies im Kommentar, aber es verdient Verstärkung.
Ihre
returnVal
Verwendung ist falschDen
pthread_join
api erwartet einvoid**
, das ist ein Zeiger auf einevoid*
. Im Gegensatz zuvoid*
einevoid**
ist nicht gleichermaßen universal. Es ist ein Zeiger eines bestimmten Typs und als solche sollten Sie nur an eine ebenfalls eingegeben Adresse. Jedoch sind Sie nicht mit es wie auch immer, ich würde vorschlagen, jetzt einfach übergeben Sie NULL. Wie geschrieben, es ist Undefiniertes Verhalten. Und ich kann all-aber-Garantie Siesizeof(char)
, die beschreibbare Größe der Adresse, die Sie geben, undsizeof(void*)
, die Größe, die es erwartet, um zur Verfügung haben, sind nicht das gleiche. Berücksichtigen Sie dies jetzt:Falls Sie sich Fragen, was der Einsatz für das
void**
parameter ist, es ist ein Ort zum speichern vonvoid*
return Wert aus thread-proc. Erinnern Sie sich an eine pthread thread-proc sieht so aus:Du bist-Logik für Fehler-Tests ist nach hinten
Den
pthread_join
Funktion gibt0
auf Erfolg; nicht auf Fehler.Du bist nicht tatsächlich ausgeführt gleichzeitigen threads
Thread-Parallelität bedeutet einfach, Ihre threads laufen gleichzeitig. Aber verkaufen tun Sie nicht. Sie starten einen thread, dann warten, bis es zu Ende ist, dann starte einen thread, dann warten, bis es zu Ende, usw. Das ist buchstäblich keine bessere (und in der Tat, tatsächlich schlimmer), als einfach nur eine Funktion aufrufen. Wenn Sie möchten, dass Ihre threads ausgeführt werden gleichzeitig deine Logik sollte im Stil wie diese:
Wenn die Funktion fehlschlägt (D. H. in jedem pthread nennen, ein return-code, der nicht gleich null ist), wird es
errno
um den Wert der Grund für den Ausfall. Es gibt ein paar Möglichkeiten, um die textuelle Erklärung der Fehlercodes.(1)
strerror
drucken die Fehlermeldung-Zeichenfolge der Fehlerwert übergeben Sie es und ist bequem für die Platzierung in printf-Anweisungen.(2)
perror
erlaubt dir einen kleinen string, die werden zuerst gedruckt, und dann wird es automatisch drucken Sie die Beschreibung der Fehler, welcher Werterrno
festgelegt ist. Sie müssen nicht explizit übergebenerrno
.(3) Es ist ein glibc-Erweiterung
printf
bieten%m
umwandlungsspezifikator das wirkt wiestrerror
aber mit ein wenig weniger Durcheinander und Aufregung. Dies wäre die am wenigsten portabel ist.Sobald Sie die Beschreibung können Sie leicht Lesen Sie die man-Seiten nennen, die gescheitert sind und Sie mehr Hinweise, warum der Aufruf fehlgeschlagen ist. Charlie Burns geschrieben hat, die Gründe
pthread_join
fehlschlagen könnte.pthread_join
zuerrno
aber ich glaube nicht, dass der pthread-Bibliothek tut dies automatisch für Sie. Also der erste Absatz ist falsch. Sie können diereturnval
wie es warerrno
so den rest deiner Antwort richtig aussieht. (-1)Bin ich etwas fehlt? Der Rückgabewert sagt, dass Sie die Fehler:
RETURN-WERTE
Wenn erfolgreich, die pthread_join () - Funktion null zurückgeben. Ansonsten
eine Fehlernummer zurückgegeben werden, um den Fehler anzuzeigen.
FEHLER
pthread_join() fehl, wenn:
joinErr = pthread_join(aThread[i], &returnVal); printf("join returned %d\n", joinErr);
immer 0 istMehr spezifisch::