2016-09-30 4 views
0

Ich studiere über Threads und gleichzeitige Programmierung. Versucht dieses grundlegende Beispiel von, was in der Klasse zur Verfügung gestellt wurde:Kann dieses grundlegende Thread-Verhalten nicht verstehen

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

#define NUM_THREADS 8 

void *printGoGators(void *noArg) 
{ 
    printf("Go Gators!\n"); 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc, t; 
    for (t = 0; t < NUM_THREADS; t++) 
    { 
     printf("Creating thread %d\n", t); 
     rc = pthread_create(&threads[t], 
       NULL, 
       printGoGators, 
       NULL); 
     if(rc) 
    { 
     printf("ERROR %d", rc); 
     exit(-1); 
    } 
    } 
    pthread_exit(NULL); 
} 

Dieser Code produziert die folgende Ausgabe. :

Creating thread 0 
Creating thread 1 
Go Gators! 
Creating thread 2 
Go Gators! 
Creating thread 3 
Go Gators! 
Creating thread 4 
Go Gators! 
Creating thread 5 
Go Gators! 
Creating thread 6 
Go Gators! 
Creating thread 7 
Go Gators! 
Go Gators! 

Warum ist Go Gators! nicht direkt gedruckt nach seiner Creating thread # für alle Threads entspricht? Bitte helfen!

+2

weil Ihre Threads voneinander unabhängig sind und vom Hauptthread, der sie erstellt. So haben Sie nach dem Start keine Kontrolle darüber, welcher Thread zuerst gedruckt wird. – HazemGomaa

+0

So wurde diese Frage für Stackoverflow als zu breit angesehen. Ich sehe niemanden, der andere Antworten anbietet. –

+1

Es ist wirklich schwer, deine Frage zu verstehen. Sie fragen, warum etwas nicht passiert, ohne irgendeinen Grund zu nennen, warum Sie denken, dass es sollte. Sie sehen das Verhalten, das Sie erwarten sollten. Wenn Sie etwas anderes erwarten, sagen Sie, warum wir den Fehler in Ihrer Argumentation erklären können. –

Antwort

4

Wenn Ihr Code so aussah, dann würde die Ausgabe in der Reihenfolge, die Sie erwarten:

for (t = 0; t < NUM_THREADS; t++) 
    { 
     printf("Creating thread %d\n", t); 
     printGoGators(NULL); 
    } 

Sie sind also eine Annahme, die Fäden in der gleichen Reihenfolge ausgeführt werden, dass sie erstellt werden. Diese Annahme ist jedoch falsch - Threads können in beliebiger Reihenfolge ausgeführt werden.

1

Nachdem Sie einen Thread erstellt haben, muss das Betriebssystem entscheiden, welche Reihenfolge-Threads ausgeführt werden. Sie können es mithilfe von Mutexen und Bedingungen steuern, um einen Thread zu sperren, lassen Sie einen anderen Thread ausführen und entsperren Sie ihn dann.

Im Gegensatz zu angenommener Antwort verwendet dieses Beispiel Threads und nicht nur etwas in einer Schleife.

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

#define NUM_THREADS 8 

pthread_mutex_t myMutex;    // Declere global mutex 
pthread_cond_t myCondition;    // Declere global condition 


void *printGoGators(void *arg) {   

    printf("Go Gators! %i\n", *(int*)arg); 
    delete (int*) arg; 

    pthread_cond_signal(&myCondition); // Signal that a condition is met 

    return NULL; 
} 

int main(int argc, char *argv[]) { 

    pthread_mutex_init(&myMutex, NULL);    // Initialize mutex 
    pthread_cond_init (&myCondition, NULL);   // Initialize condition 

    pthread_t threads[NUM_THREADS]; 
    int rc, t; 
    for (t = 0; t < NUM_THREADS; t++) { 

     int* n = new int; 
     *n = t; 

     printf("Creating thread %d\n", t); 
     rc = pthread_create(&threads[t], 
       NULL, 
       printGoGators, 
       n);    

     if(rc) { 
     printf("ERROR %d", rc); 
     exit(-1); 
    } 


    pthread_cond_wait(&myCondition, &myMutex);   // waite for condition 

    } 
    pthread_exit(NULL); 
} 

Ergebnis:

Creating thread 0 
Go Gators! 0 
Creating thread 1 
Go Gators! 1 
Creating thread 2 
Go Gators! 2 
Creating thread 3 
Go Gators! 3 
Creating thread 4 
Go Gators! 4 
Creating thread 5 
Go Gators! 5 
Creating thread 6 
Go Gators! 6 
Creating thread 7 
Go Gators! 7 

Haupt Thread-Erzeugung Schleife: einen Thread erstellen und dann für den Zustand warten.

Neuer Thread: Drucken Sie eine Nachricht und signalisieren Sie, dass die Bedingung erfüllt ist.

Auf diese Weise verwalten Sie die Reihenfolge der Ausführung.

Verwandte Themen