2017-05-21 1 views
-3

Ich muss ein Programm schreiben, das 2 Threads erstellt, die ihre eigene ID drucken und dann beenden.
Die Threads müssen ihre ID abwechselnd ausgeben (A, B, A, B, ...).Faden Übung. Drucken Sie abwechselnd die IDs von zwei verschiedenen Threads

void *funct(); 
//void *functz(); 
//int functie=0; 

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER; 

int main(){ 
     int rc1, rc2; 
     pthread_t thread1, thread2; 

    if((rc1 = pthread_create(&thread1, NULL, &funct, NULL))) 
     { 
       printf("Eroare la creare thread: %d \n", rc1); 
     } 
     if((rc2 = pthread_create(&thread2, NULL, &funct, NULL))) 
     { 
       printf("Eroare la creare thread: %d \n", rc2); 
     } 
     pthread_join (thread1, NULL); 
     pthread_join (thread2, NULL); 

     return 0; 
} 

void *funct() 
{ 
     int i; 
     //pthread_mutex_lock(&mutex1); 
     for(i=0; i<10; i++) 
     { 
     //pthread_mutex_lock(&mutex1); 
     //pthread_mutex_lock(&mutex2); 
       printf("Thread ID: %li \n", pthread_self()); 

     //pthread_mutex_unlock(&mutex2); 
     //pthread_mutex_unlock(&mutex1); 
     } 
    //pthread_mutex_unlock(&mutex1); 
} 
/* 
void *functz() 
{ 
     int i; 
     //pthread_mutex_lock(&mutex1); 
     for(i=0; i<10; i++) 
     { 
     pthread_mutex_lock(&mutex2); 

       printf("Thread ID: %li \n", pthread_self()); 

     pthread_mutex_lock(&mutex1);  
     } 
*/ 

Wie Sie sehen können, habe ich mehrere Strategien ausprobiert, aber keiner von ihnen war erfolgreich.

+0

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+1

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage so bearbeiten, dass sie ein [minimales, vollständiges und überprüfbares] (http://stackoverflow.com/help/mcve) Beispiel enthält, das Ihr Problem zusammen mit den Beobachtungen, die Sie im Debugger gemacht haben, reproduziert . –

+2

Sie haben vergessen, eine Frage zu stellen. Auch: Was meinst du mit nicht erfolgreich? Hat Ihr Compiler oder Linker Ihnen einen Fehler (welcher)? Ist das Programm zur Laufzeit abgestürzt (Was hat der Debugger gesagt)? Wurde die richtige Ausgabe nicht gedruckt (welcher Ausgabe wurde gedruckt)? – nwp

Antwort

0

Mutex Vergessen.

Verwenden zwei Semaphoren, zB semRunA, um 1 Einheit initialisiert und semRunB, mit 0 Einheiten initialisiert. Dann tauschen um die eine 'Hinrichtung token':

Gewinde A:

while(true){ 
    wait(semRunA); 
    print(threadID); 
    post(semRunB); 
}; 

Gewinde B:

while(true){ 
    wait(semRunB); 
    print(threadID); 
    post(semRunA); 
}; 

Sehen Sie, wie einfach es ist, wenn Sie die richtigen Synchronisierungsobjekte verwenden?

Verwandte Themen