2017-12-31 309 views
-3

Ich möchte Sequenz wie 1,2,3,1,2,3 ... drucken, aber der folgende Code wird nicht in dieser Reihenfolge gedruckt. Ich bin nicht in der Lage zu verstehen, wo ich beim Semaphor Fehler mache. Bitte helfen Sie mir, den Fehler zu verstehen, den ich in diesem Code mache, damit ich es beheben kann.C-Code Pthread Semaphor-Programm mit 3 Threads, die in der Reihenfolge

#include <pthread.h> 
#include <stdio.h> 
#include <semaphore.h> 
#include <unistd.h> 

#define MAX_NUM 50 
sem_t sem1, sem2, sem3; 

void *f1(void*) 
{ 
    sem_wait(&sem1); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF1(): %d", 1); 
    sem_post(&sem2);   
    } 
} 

void* f2(void*) 
{ 
    sem_wait(&sem2); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF2(): %d", 2); 
    sem_post(&sem3); 
    } 
} 

void* f3(void*) 
{ 
    sem_wait(&sem3); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF3(): %d", 3);  
    sem_post(&sem1); 
} 
} 

int main() 
{ 
    pthread_t p1, p2, p3; 
    sem_init(&sem1, 0, 1); 
    sem_init(&sem2, 0, 1); 
    sem_init(&sem3, 0, 1); 

    pthread_create(&p1, NULL, f1, (void*)NULL); 
    pthread_create(&p2, NULL, f2, (void*)NULL); 
    pthread_create(&p3, NULL, f3, (void*)NULL); 

    pthread_join(p1, NULL); 
    pthread_join(p2, NULL); 
    pthread_join(p3, NULL); 

    return 0; 

} 
+1

Sie alle der Semaphore initialisieren auf die gleiche Weise und benutze sie auf die gleiche Weise; Warum würdest du erwarten, dass 'F1' zuerst druckt? –

Antwort

2

Sie müssen sem1 anders von den anderen initialisieren, damit F1 seine anfängliche sem_wait erste bekommt Vergangenheit.

Beachten Sie auch, dass, sobald jede Funktion in ihre Schleife eintritt, sie nie wieder sem_wait aufruft, was bedeutet, dass Sie keine Kontrolle über die Reihenfolge des Druckens mehr haben.

+0

Insbesondere müssen die Semaphore 'sem2' und' sem3' mit einem Semaphorwert von 0 initialisiert werden, so dass die Funktionen 'f2()' und 'f3()' nicht anfänglich ablaufen. 'sem1' könnte auch auf diese Weise für Symmetrie und Konsistenz initialisiert werden, vorausgesetzt, dass der Hauptthread einmal an' sem1' gesendet wird, um 'f1()' das erste Mal ablaufen zu lassen. –

+0

Danke für den Rat. Ich konnte das Problem finden und den Code reparieren – Nripendra

0

intialize die sem2 und SEM3 mit 0 und Put sem_wait (...) Looping rufen in alle functions.I Code unten hoffen, gibt die erwartete 123.123 Ergebnisse ...

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


#define MAX_NUM 50 
sem_t sem1, sem2, sem3; 

void *f1(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem1); 
    printf("\nF1(): %d", 1); 
    sem_post(&sem2); 
    } 
} 

void *f2(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem2); 
    printf("\nF2(): %d", 2); 
    sem_post(&sem3); 
    } 
} 

void *f3(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem3); 
    printf("\nF3(): %d", 3); 
    sem_post(&sem1); 
} 
} 


int main() 
{ 
    pthread_t p1, p2, p3; 
    sem_init(&sem1, 0, 1); 
    sem_init(&sem2, 0, 0); 
    sem_init(&sem3, 0, 0); 

    pthread_create(&p1, NULL, f1, (void*)NULL); 
    pthread_create(&p2, NULL, f2, (void*)NULL); 
    pthread_create(&p3, NULL, f3, (void*)NULL); 
    pthread_join(p1, NULL); 
    pthread_join(p2, NULL); 
    pthread_join(p3, NULL); 

    return 0; 

} 
Verwandte Themen