2010-10-03 18 views
7

Für eine Hausaufgabe muss ich das folgende Szenario programmieren. Dies wird mit Semaphoren unter Verwendung von BACI (das ist C--)Semaphore und gleichzeitige Programmierung

Es gibt 2 Unisex-Toiletten, die jeweils 4 Personen halten können. Da es sich um Unisex handelt, können nur Menschen gleichen Geschlechts gleichzeitig auf der Toilette sein und FIFO ist nicht wichtig. Ich habe den grundlegenden "Algorithmus" in meinem Kopf, um 4 Männer und 4 Frau für 1 Toilette zu behandeln. Aber ich weiß nicht, wie ich das programmieren soll. Jede Hilfe würde sehr geschätzt werden. Hier ist was ich habe.

Woman: 

Check to see if there are any men in the restroom. If so "wait". 
If no men check to see if there are 4 people. If so "wait". 
If no men and not 4 use restroom. When leaving signal there is a vacancy. 
If last woman signal the men if they are waiting if not signal the woman. 


Man: 

check to see if there are any woman in the restroom. if so "wait" 
If no woman check to see if there are 4 people. If so "wait". 
If no woman and not 4 use restroom. when leaving signal there is a vacancy. 
if last man signal the women if they are waiting if not signal the men. 

Diese zusätzlichen Anweisungen wurden

bereitgestellt
  • Verwenden zufällige FOR-Schleifen den Lauf der Zeit an den entsprechenden Stellen zu simulieren. Dies kann leicht durch die Verwendung einer Delay-Funktion erfolgen:

    void Delay (void) 
    { 
        int i; 
        int DelayTime; 
        DelayTime = random (DELAY); 
        for (i = 0; i < DelayTime; i++): 
    } 
    
  • wo const int DELAY = eine Zahl von 10 bis 100

  • Drucken und Format Ausgabe schön und Drucknachrichten in einer Weise, dass durch das Lesen die Ausgabe, kann man die Ausführungsreihenfolge verfolgen.
  • Legen Sie die Prozesse für immer in Schleife fest, und verwenden Sie die Steuerung C (oder Steuerumbruch), um Ihr Programm zu stoppen.
+0

Ist es optimal sein müssen? –

+0

Nein. Aber es kann nicht verhungern. Also müssen Männer und Frauen die Toilette ziemlich benutzen. – Jen

+0

Ich bin mir nicht sicher, ob du wegen des Hungers besorgt bist, aber ich bin mir ziemlich sicher, dass dein Algorithmus ein Hungerproblem hat. Stellen Sie sich den Fall vor, in dem ein Mann auftaucht, während eine Frau bereits im Badezimmer ist, und ein stetiger Strom von Frauen immer wieder auftaucht, damit das Badezimmer niemals leer wird. –

Antwort

0

Hier ist was ich habe. Dies ermöglicht 1 Person in der Toilette zu einer Zeit ohne Stillstand oder Verhungern. Ich brauche Hilfe, wie man es macht, damit 4 Leute auf der Toilette gleichzeitig sein können.

const int Delayx = 60; 
int i; 
semaphore max_capacity; 
semaphore woman; 
semaphore man; 
semaphore mutex; 

void Delay(void) 
{ 
    int DelayTime; 
    DelayTime = random(Delayx); 
    for (i = 0; i<DelayTime; i++); 
} 

void Woman(void) 
{ 
    wait(woman); 
    wait(max_capacity); 
    wait(mutex); 
    cout << "A Woman has entered Restroom"<<endl; 
    Delay(); 
    cout << "A woman has exited Restroom"<<endl; 
    signal(mutex); 
    signal(max_capacity); 
    signal(man); 
} 

void Man(void) 
{ 
    wait(man); 
    wait(max_capacity); 
    wait(mutex); 
    cout <<"A Man has entered the Restroom"<<endl; 
    Delay(); 
    cout << "A man has exited the Restroom"<<endl; 
    signal(mutex); 
    signal(max_capacity); 
    signal(woman); 
} 

void main() 
{ 
    initialsem(woman,1); 
    initialsem(man,1); 
    initialsem(max_capacity,4); 
    initialsem(mutex,1); 
    cobegin 
    { 
     Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Man(); Man(); Man(); Man(); Man(); Man(); Man(); Man(); 
    } 
} 
1

Da Sie how to code your algorithm for 1 restroom wissen wollen, ich habe so in C. getan Es wird eine ziemlich einfache Aufgabe sein, es in C-- zu konvertieren, da alle Semaphore Konstrukte sehr ähnlich erscheinen.

Von dem, was ich Ihrer Antwort,

wie gesagt machen könnte
C: sem_wait() C--: wait() 
    sem_post()  signal() 
    sem_t   semaphore() 
    sem_init()  initialsem() 

Bedenken Sie, habe ich das Problem für 1-Toilette nur gearbeitet. Da dies Hausaufgaben sind, erwarte ich, dass Sie es in die 2-Toiletten Form selbst erweitern.

seinen Weg vom Readers-writers problem zu unserer "Unisex Toilette" Problem arbeiten, nutzen wir die folgenden globalen Variablen:

int mcount,wcount; // count of number of men/women in restroom 
sem_t x,y,z;  // semaphores for updating mcount & wcount values safely 
sem_t wsem,msem; // semaphores to block other genders' entry 
sem_t cap;   // capacity of the restroom 

diesen Semaphore & Zähler in die man Thread-Funktion,

void *man(void *param) 
{   
    sem_wait(&z);     
     sem_wait(&msem);   
      sem_wait(&x); 
       mcount++; 
       if(mcount==1) 
       { sem_wait(&wsem); } // first man in, make women wait 
      sem_post(&x); 
     sem_post(&msem); 
    sem_post(&z); 

    sem_wait(&cap); //wait here, if over capacity 

    printf("\t\tman in!\n"); 
    delay(); 
    printf("\t\t\tman out!\n"); 

    sem_post(&cap); //one man has left, increase capacity 

    sem_wait(&x); 
     mcount--; 
     if(mcount==0) 
     {sem_post(&wsem);} // no man left, signal women 
    sem_post(&x); 
} 
Einbeziehung

In ähnlicher Weise ersetzt die Frau Thread-Funktion mcount mit wcount, msem mit wsem und x mit y. Nur z bleibt so wie in der man Funktion, so dass beide man & woman Threads auf dem gleichen gemeinsamen Semaphor Warteschlange.(Aufgrund dieser Tatsache immer der Code FIFO-like Verhalten, das Fairness/Nicht-Verhungern gewährleistet)

Der vollständige Code wird wie folgt: (kompilieren, verwenden gcc filename -lpthread)

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

int mcount,wcount; 
sem_t x,y,z,wsem,msem,cap; 

void delay(void) 
{ 
    int i; 
    int delaytime; 
    delaytime = random(); 
    for (i = 0; i<delaytime; i++); 
} 

void *woman(void *param) 
{ 
    sem_wait(&z); 
     sem_wait(&wsem); 
      sem_wait(&y); 
       wcount++; 
       if(wcount==1) 
       { sem_wait(&msem); } 
      sem_post(&y); 
     sem_post(&wsem); 
    sem_post(&z); 

    sem_wait(&cap); 

    printf("woman in!\n"); 
    delay(); 
    printf("\twoman out!\n"); 

    sem_post(&cap);  

    sem_wait(&y); 
     wcount--; 
     if(wcount==0) 
     { sem_post(&msem); } 
    sem_post(&y); 
} 

void *man(void *param) 
{   
    sem_wait(&z); 
     sem_wait(&msem); 
      sem_wait(&x); 
       mcount++; 
       if(mcount==1) 
       { sem_wait(&wsem); } 
      sem_post(&x); 
     sem_post(&msem); 
    sem_post(&z); 

    sem_wait(&cap); 

    printf("\t\tman in!\n"); 
    delay(); 
    printf("\t\t\tman out!\n"); 

    sem_post(&cap); 

    sem_wait(&x); 
     mcount--; 
     if(mcount==0) 
     {sem_post(&wsem);} 
    sem_post(&x); 
} 

int main(void) 
{ 
    int i; 
    srandom(60); 

     mcount = 0; 
     wcount = 0; 
     sem_init(&x,0,1); // for sem_init, initial value is 3rd argument 
     sem_init(&y,0,1); 
     sem_init(&z,0,1); 
     sem_init(&wsem,0,1); 
     sem_init(&msem,0,1); 
     sem_init(&cap,0,4); // eg. cap initialized to 4 

     pthread_t *tid; 
     tid = malloc(80*sizeof(pthread_t)); 

    // You can use your cobegin statement here, instead of pthread_create()  
    // I have forgone the use of pthread barriers although I suppose they would nicely imitate the functionality of cobegin. 
    // This is merely to retain simplicity. 

    for(i=0;i<10;i++) 
    { 
     pthread_create(&tid[i],NULL,woman,NULL); 
    } 
    for(i=10;i<20;i++) 
    {  
      pthread_create(&tid[i],NULL,man,NULL); 
    } 
    for(i=0;i<20;i++) 
    {  
      pthread_join(tid[i],NULL); 
    } 

    return(0); 
} 

Bei der Umwandlung in die 2-Toiletten Formular, notieren Sie, welche Semaphoren & Zähler Variablen müssen Sie doppelt, um alle Bedingungen zu erfüllen. Glücklich Semaphoring!

0

für 4 Toilette baci Code:

const int Delayx = 60; 
    int i; 
    int Mcount,Wcount; 
    binarysem x,y,z,Wsem,Msem; 
    semaphore cap; 
    void Delay(void) 
    { 
    int DelayTime; 
    DelayTime = random(Delayx); 
    for (i = 0; i<DelayTime; i++); 
    } 

void Woman(void) 
    { 
    wait(z); 
    wait(Wsem); 
    wait(y); 
    Wcount++; 
    if(Wcount==1) 
     { wait(Msem); } 
     signal(y); 
     signal(Wsem); 
     signal(z); 

     wait(cap); 
     cout << "A Woman has entered Restroom"<<endl; 
     Delay(); 
     cout << "A Woman has exited Restroom"<<endl; 

     signal(cap); 
     wait(y); 
     Wcount--; 
     if(Wcount==0) 
     {signal(Msem);} 

     signal(y); 
     } 

void Man(void) 
    { 
    wait(z); 
    wait(Msem); 
    wait(x); 
    Mcount++; 
    if(Mcount==1) 
     { wait(Wsem); } 
     signal(x); 
     signal(Msem); 
     signal(z); 

     wait(cap); 
     cout << "A Man has entered Restroom"<<endl; 
     Delay(); 
     cout << "A Man has exited Restroom"<<endl; 

     signal(cap); 
     wait(x); 
     Mcount--; 
     if(Mcount==0) 
     {signal(Wsem);} 

     signal(x); 
     } 


void main() 
{ 
Mcount=0; 
Wcount=0; 
initialsem(x,1); 
initialsem(y,1); 
initialsem(z,1); 
initialsem(Wsem,1); 
initialsem(Msem,1); 
initialsem(cap,4); 
cobegin 
{ 
    Woman(); Woman(); Woman(); 
    Woman(); Woman(); Woman(); 
    Woman(); 
    Woman(); Man(); Man(); 
    Man(); Man(); Man(); Man(); 
    Man(); Man(); 
} 
     }