2016-11-08 5 views
1

Es ist ein Jahr oder so seit ich mit pthreads aus einem OS-Klasse gespielt habe und ich habe versucht, nur zum Spaß zurück in es zu bekommen. Unten ist der Code für meine einfache Threading-Übung, die ich von online source durchlaufen habe. Meine Sorge ist, dass das Tutorial sagt, dass die ausgegeben werden soll:Aufrufen von Threads vor dem Drucken noch Drucken wird vor Threads ausgeführt

Thread 1 
Thread 2 
pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 

, die für mich Sinn macht. Aber ich bin immer

pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 
Thread 1 
Thread 2 

pthread1.c

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *print_message_function(void *ptr); 

main() 
{ 
    pthread_t thread1, thread2; 
    const char *message1 = "Thread 1"; 
    const char *message2 = "Thread 2"; 
    int iret1, iret2; 

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

    if(iret1) 
    { 
     fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1); 
     exit(EXIT_FAILURE); 
    } 

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

    if(iret2) 
    { 
     fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2); 
     exit(EXIT_FAILURE); 
    } 

    printf("pthread_create() for thread 1 returns: %d\n",iret1); 
    printf("pthread_create() for thread 2 returns: %d\n",iret2); 


    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    exit(EXIT_SUCCESS); 

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

Es sieht so aus, als ob Ihr Tutorial falsch ist. Nachrichten können in beliebiger Reihenfolge oder sogar in Intervallen angezeigt werden. –

+1

Der neue Thread kann, aber nicht immer, vor der Rückgabe von pthread_create() ausgeführt werden. Sie können also die Kontrolle in main() zurückholen, bevor jeder Thread beginnt oder danach. Diese Unvorhersagbarkeit bedeutet, dass die Anzeigeanweisungen in einer anderen Reihenfolge als die Textbuchantwort angezeigt werden können. –

+0

der gepostete Code wird nicht sauber kompiliert! Aktivieren Sie beim Kompilieren immer alle Warnungen und beheben Sie diese Warnungen. (für 'gcc', bei minimaler Verwendung:' -Wall -Wextra -pedantic' verwende ich auch: '-Wconversion -std = gnu99') 1) es gibt nur zwei gültige Signaturen für die' main() 'Funktion:' int main (void) 'und' int main (int argc, char * argv []) 'Beachten Sie, dass beide den Rückgabetyp von' int' 2) haben. Der 'main()' -Funktion fehlt die abschließende geschweifte Klammer '}', 3) Die Funktion 'print_message_function()' hat einen Rückgabetyp von 'void *', aber es fehlt die eigentliche 'return'-Anweisung. – user3629249

Antwort

1

Das Race-Bedingung genannt wird.

Es kann sein, dass, nach der Erstellung von thread1, der Scheduler thread1 function1 zuerst einplant, dann ist es möglich, dass die thread-Funktion zuerst ausgeführt wird und dann Ihre main() -Drucke kommen.

Auf meinem System, wenn ich dein Programm laufen lasse.

[email protected]:~$ ./a.out 
pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 
Thread 2 
Thread 1 
[email protected]:~$ ./a.out 
pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 
Thread 1 
Thread 2 
1

Schauen Sie sich das Tutorial genau an. Scheint mir, dass es einen Fehler gibt: Code und sein Ergebnis stimmen einfach nicht überein (Code ist über Rückkehrcode von pthread_create und Ausdruck ist über Threadrückkehrcode, der nicht zugänglich ist, weil Anrufe pthread_join mit getan werden NULL als zweiter Parameter sowie print_message_function Mangel an sinnvoll etwas Rückkehr)

Versuchen Schlaf (0); vor if (iret2) zum Spaß ...

1

Die Reihenfolge der Ausführung hängt von O Scheduling algorithm.Hence, ein entweder des Gewindes oder der Funktionsfaden zu schaffen kann geplant get (auf der Algo O Terminierung abhängig) .

Verwandte Themen