2012-04-25 9 views
7

Ich bin neu im Threading. Hier wenn ich einen Kommentar pthread_join (thread1, NULL) dann in der Ausgabe manchmal bekomme ichMehrfache Ausführung des gleichen Thread-Unterprogramms beim Kommentieren von pthread_join für diesen Thread

Thread2 
    Thread1 
    Thread1 

Ich bin nicht in der Lage zu verstehen, warum Thread1 Spur kommt zweimal und was ist die genaue Funktionalität von pthread_join.

Bitte beachten Sie auch einige Tutorial über Threading-Konzepte für Anfänger.

void *print_message_function(void *ptr); 
    main() 
    { 
      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); 

      pthread_join(thread2, NULL); 

      printf("Thread 1 returns: %d\n",iret1); 
      printf("Thread 2 returns: %d\n",iret2); 
      exit(0); 
    } 

    void *print_message_function(void *ptr) 
    { 
      char *message; 
      message = (char *) ptr; 
      printf("%s \n", message); 
    } 
+0

Nur um zu bestätigen, dass ich dies auf CentOS 6.2 mit gcc 4.4.6 reproduzieren kann. Schönes Puzzle! (+1) – NPE

+0

Meine GCC-Version ist 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) Thread-Modell: Posix –

+0

Kann nicht mit 'gcc Version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) Thread reproduzieren Modell: Posix'. –

Antwort

1

Wenn ich diese Ergebnisse immer bin, zunächst würde ich Folgendes tun:

1) Anstelle von unten Linien,

iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1); 

iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2); 
pthread_join(thread1, NULL); 

pthread_join(thread2, NULL); 

ersetzen Sie es durch,

iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1); 

pthread_join(thread1, NULL); 
iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2); 

pthread_join(thread2, NULL); 

und Sehen Sie, was das Ergebnis ist.

2) Innerhalb Ihrer Thread-Funktion müssen Sie pthread_exit aufrufen ("Exit"); Dies ist ein geeigneter Weg, um die Thread-Funktion zu verlassen. Mach es am Ende der Funktion.

Wenn Sie es so machen, sollten Sie idealerweise kein Problem haben. In jedem Fall gehe ich davon aus, dass Sie Ihr Programm mit gcc -D_REENTRANT -o threadex threadex.c -lpthread

kompilieren. Dies ist nicht die endgültige Lösung. Wenn es gut läuft, können wir mit dem nächsten Schritt fortfahren, beide Threads gleichzeitig zu starten.

Bitte teilen Sie das Feedback nach der Einbeziehung dieser Änderungen.

0

Vielleicht wird der Ausgabepuffer nicht richtig gespült. Ich habe ein sehr ähnliches Problem beim Multithreading festgestellt und die Ausgabe an eine Datei weitergeleitet - manchmal erschien die Ausgabe zweimal. Versuchen Sie, diese Zeile zu Ihrer Hauptfunktion hinzuzufügen:

Dies wird dazu führen, dass der Ausgabepuffer bei jedem Schreibvorgang geleert wird.

Verwandte Themen