Oder nicht pthread_join() ermöglichen die Ausführung der aufrufende thread weiter?
edit:
Ich habe die falsche Annahme, dass die threads laufen begann, auf pthread_join
wenn Sie tatsächlich in Betrieb pthread_create
.
Ich bin mit dem lernen von Posix-threads, und ich habe gelesen, dass:
pthread_join() - wait for thread termination
So, in dem Beispielcode, main exit(0) wird nicht erreicht, bis beide begannen threads Ende.
Aber nach dem ersten Aufruf von pthread_join(), main werden weiterhin ausgeführt, da der zweite Aufruf von pthread_join() tatsächlich ausgeführt, und die Nachricht in zwischen ist gedruckt.
Also, wie ist das? hat main weiter ausgeführt wird, während beide threads sind noch nicht ganz fertig? oder nicht?
Ich weiß, das ist nicht zuverlässig testen, aber der zweite test-Nachricht wird immer gedruckt, nachdem die beiden threads fertig sind, egal wie lange die Schleife ist. (zumindest auf meinem Rechner, wenn ich es versuchte)
void *print_message_function( void *ptr )
{
char *message = (char *) ptr;
for( int a = 0; a < 1000; ++a )
printf( "%s - %i\n", message, a );
return NULL;
}
//
int main( int argc, char *argv[] )
{
pthread_t thread1, thread2;
char message1[] = "Thread 1";
char message2[] = "Thread 2";
int iret1, iret2;
//
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
//
pthread_join( thread1, NULL);
printf( "Let's see when is this printed...\n" );
pthread_join( thread2, NULL);
printf( "And this one?...\n" );
//
printf("Thread 1 returns: %d\n",iret1);
printf("Thread 2 returns: %d\n",iret2);
exit(0);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion
pthread_join
wartet, bis der thread fertig ist oder gibt sofort einen Wert zurück, wenn der thread bereits erledigt ist.Also in deinem Fall
Falsch.
pthread_join
wartet, es sei denn, thread1 ist bereits getan.pthread_join()
nicht wieder (blockieren des aufrufenden thread), bis der thread verbunden wurde beendet. Wenn der thread bereits beendet, dann kehrt es sofort.Im test, beide threads beenden, und so natürlich sehen Sie alle Nachrichten gedruckt, die aus dem Haupt-thread. Wenn die erste Nachricht gedruckt wird, wissen Sie, dass
thread1
abgeschlossen ist; wenn der zweite gedruckt wird, wissen Sie, dassthread2
ist auch abgeschlossen. Dies wird wahrscheinlich passieren sehr schnell nach dem ersten, da beide threads die gleiche Menge an Arbeit in etwa die gleiche Zeit.Den Haupt-thread wartet hier auf dieser join-Aufruf bis
thread1
vervollständigt seine Arbeit. Einmalthread1
Ausführung Haupt-thread gehen Sie vor und führen Sie die nächste Anweisungprintf
.Wieder Haupt-thread warten Sie hier, bis
thread2
vervollständigt seine Arbeit.Einmal
thread2
ergänzt die Arbeit der Haupt-thread bewegt sich vor und die nächste Anweisung, die dieprintf
ausgeführt wird.Der Sequenz wird die Arbeit in der oben genannten Weise.Wahrscheinlich, dies passiert nur allzu schnell, dass die Spuren, die Sie sehen, macht es verwirrend.
Auch nicht mit
printf
zu sehen, Verhalten von Multithread-Programme können ziemlich irreführend, die Reihenfolge der printf kann nicht immer auf das richtige Steuerelement fließen, Da ist es timing basiert und Spülen der Puffer von stdout kann nicht passieren, in sasme Reihenfolge wie die Drucke wurden ausgeführt durch threads.Wenn die ersten pthread_join sofort zurückgegeben, das würde bedeuten, dass der erste thread ist bereits beendet. Was bedeutet der Ausgang Aussehen? Siehst du "Thread" 1 - n" Ausgabe nach "mal sehen, Wann dieses gedruckt wird"?