2

Verzeihen Sie, ich beginne gerade das Konzept des Multithreading, ich habe mich nur gewundert, warum meine Threads möglicherweise schon beendet sind, bevor sie sich verbinden. Im Grunde habe ich eine globale Liste von Prozess-IDs bin beibehalten, ich sie iterativ durch den Aufruf erstellenThreads, die vor dem Beitritt beendet werden

if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) { 
     fprintf(stderr, "error thread not created\n"); 
    } 

Das Problem ist jetzt, alle meine Fäden austreten, bevor sie an meine Pthread beitreten bekommen

pthread_join(thread_id[i], NULL); 

die ist tief in einem Funktionsaufruf verschachtelt, der direkt nach der Erstellung der Threads aufgerufen wird. Ich bin mir nicht sicher, ob ich etwas locking oder etwas tun soll, oder füge einen zusätzlichen Befehl hinzu, um sicherzustellen, dass die Threads vor dem Beenden auf die Join-Anweisung warten.

+0

Es hängt von 'function_to_execute' ab. Vielleicht wirft es eine Ausnahme? Und wie kannst du sagen, dass sie aussteigen, bevor sie 'Join' erreichen? Vielleicht sind sie in Endlosschleife oder etwas – AhmadWabbi

+6

Es gibt kein Problem, wenn der Thread, mit dem Sie 'pthread_join()' sind, bereits beendet wurde. In diesem Fall wird der 'pthread_join()' sofort zurückkehren, während er ansonsten warten muss. * Allerdings *: Sie * müssen * nicht versuchen, 'pthread_join()' mit einem Thread zu bearbeiten, der bereits 'pthread_join()' ed oder 'pthread_detach()' ed ist. – EOF

+0

sehr gut Threading Tutorial: https://computing.llnl.gov/tutorials/pthreads/ – yano

Antwort

2

Von POSIX Dokumentation:

Die pthread_join() Funktion Ausführung des rufenden Thread aussetzen muss, bis der Ziel-Thread beendet wird, es sei denn, das Ziel-Thread bereits beendet hat. Bei der Rückkehr von einem erfolgreichen Aufruf pthread_join() mit einem Nicht-NULL value_ptr-Argument wird der Wert, der vom abschließenden Thread an pthread_exit() übergeben wird, in der durch value_ptr referenzierten Stelle verfügbar gemacht. Wenn ein pthread_join() erfolgreich zurückgibt, wurde der Zielthread beendet. Die Ergebnisse von mehrere gleichzeitige Aufrufe von Pthread_join(), die denselben Zielthread angeben, sind nicht definiert. Wenn der Thread, der pthread_join() aufruft, abgebrochen ist, darf der Ziel-Thread nicht getrennt werden.

Also, nein. Sie müssen keine zusätzlichen Maßnahmen ergreifen, solange Sie die oben genannten Anforderungen erfüllen.

0

Ich bin mir nicht ganz sicher, warum es ein Problem wäre, wenn Threads fertig sind, bevor ihr Exit-Status von pthread_join() beansprucht wird?

Das ist völlig normal.

pthread_create() startet einen neuen Thread der Ausführung bei der angegebenen Funktion. Die Funktion wird sofort ausgeführt und kann sogar den Starter-Thread vorzeitig beenden. Ein Thread hat seine eigenen lokalen Variablen (Stapel) und Thread-lokale Variablen. Alle anderen Shared-Memory-Zugriffe müssen koordiniert werden, oder Daten-Rennen werden stattfinden. Normalerweise freigegebene Daten sind durch Mutexe geschützt. Der Thread wird weiterhin ausgeführt (normalerweise parallel zu anderen Threads), bis er entweder durch eine Synchronisierungsoperation blockiert wird oder der Thread die its start-Funktion beendet.

Der Thread kann mit pthread_join() warten, damit andere Threads die Ausführung erfolgreich beenden. Wie usr bemerkte Pthread_join() wird nicht warten, wenn Thread bereits fertig ist.

Verwandte Themen