Ist es gültig, auf Anruf pthread_join auf dem Haupt-thread?
Ist das Verhalten von diesem code-definiert?
#include <stdio.h>
#include <pthread.h>
pthread_t mt;
void *start(void *x)
{
void *y;
pthread_join(mt, &y);
printf("joined main thread\n");
return 0;
}
int main()
{
pthread_t t;
mt = pthread_self();
pthread_create(&t, 0, start, 0);
pthread_exit(0);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist möglich. In der Tat, diese Möglichkeit ist einer der wichtigsten Gründe, warum
pthread_detach()
vorhanden ist. Von der POSIX-Dokumentation fürpthread_detach()
(sieheman pthread_detach
):Also, was Sie vorschlagen, ist in Ordnung, nach den Maßstäben.
Edit: Nur um zu bestätigen, dass weitere, die POSIX Beschreibung der
exec()
Staaten:Kann ich mir nicht vorstellen, warum würden Sie tun dies in einem real-world-Anwendung (jemand, bitte Kommentar ein Beispiel, wenn Sie von einem denken), aber ich glaube, es ist nicht einmal möglich. Alle Suchanfragen bezüglich pthreads, die ich angeschaut haben, haben immer die Verknüpfung aufgerufen wird, von der main-thread, nicht in einem sekundären thread.
Join erfordert auch, dass der Faden, den Sie versuchen, Verknüpfung erstellt, mit der PTHREAD_CREATE_JOINABLE Flagge. Ich habe nicht in der Lage zu finden, keine Dokumentation, die besagt, ob oder nicht der Haupt-thread ist als solches geschaffen.
Codeguru hat eine ähnliche Frage hier die möglicherweise oder möglicherweise nicht helfen, deaktivieren Sie es.
Wenn das, was Sie erreichen wollen, ist der Kind-thread weitermachen nach der Haupt-thread beendet wurde, sollten Sie das Kind-thread abgetrennt, oder verwenden Sie
fork
/vfork
statt, je nachdem, welche Plattform Sie auf.PTHREAD_CREATE_JOINABLE
ist der Standard nach POSIX; Sie nicht brauchen, um einepthread_attr_t
zu erhalten.Dein Ansatz sieht formal gültig für mich, insbesondere da Sie die
pthread_exit
am Endemain
.Auf der anderen Seite kann ich nicht finden, eine Anzeige in POSIX, ob oder ob nicht der erste thread von
main
sollte je oder nicht. Die Begründung in psmears " Antwort verlangt nur, dassmain
sollte abnehmbar sein, Woher es erstellt je.Auch etwas anderes böswillige nennen könnte
pthread_detach
aus ein Unterprogramm aufgerufen von main oder so. So sollten Sie definitiv überprüfen Sie den Rückgabewert vonpthread_join
zu prüfen, für einen solchen Fall.Auch in deinem Beispiel-code, den Sie haben, ein Wettlauf zwischen der Schaffung von
start
sowie die Beendigung dermain
:main
könnte beendet werden, bevorstart
kommt beipthread_join
Mutexing der Zugang zu den
mt
variable sollte capure, dass.pthread_detach
wurde bereits genannt, auf einem thread, das Ergebnis des Aufrufspthread_join
auf diesem thread ist nicht definiert; es müssen keine Fehler, und in der Tat könnte es zum Absturz, wenn der thread bereits beendet und seine Ressourcen freigegeben.main
Anrufepthread_exit
vorstart
Anrufepthread_join
. Die Semantik eines je-thread sind wie die einespid
für einen Kind-Prozess. Genau wie diepid
reserviert ist (zombie-Prozess), bis Sie warten und sammeln Sie Ihre exit-status, derpthread_t
ist gültig, bis Sie Sie trennen oder verbinden den thread, auch wenn es bereits beendet wurde.The pthread_join() function shall fail if: *EINVAL* The implementation has detected that the value specified by thread does not refer to a joinable thread.
pthread_join()
darf nicht falls die implementation erkennt eine ungültige thread-id. Es nicht sagen, dass die Umsetzung muss in der Lage sein zu erkennen, wie eine ungültige thread-id, und in der Tat der glibc unter Linux und Abstürzen in diesen Fällen: siehe udrepper.livejournal.com/tag/programming%20posixpthread_join
zurückEINVAL
auf einem getrennten thread , wenn es noch läuft, aber wenn der thread beendet ist, sollte man erwarten, dass die Hölle losbrechen.SIGSEGV
wenn Sie Glück haben, und zufällig Eintritt oder beschädigen einen anderen thread, wenn der thread-id zugewiesen bekam oder Speicher frei für etwas anderes.