Semaphores and concurrent programming

后端 未结 3 1831
悲哀的现实
悲哀的现实 2021-01-02 19:08

For a homework assignment i need to program the following scenario. This is going to be done using semaphores using BACI (which is C--)

There are 2 unisex restrooms

3条回答
  •  爱一瞬间的悲伤
    2021-01-02 19:59

    Since you want to know how to code your algorithm for 1 restroom, I have done so in C. It will be a fairly simple task to convert it into C--, as all the semaphore constructs appear quite similar.

    From what I could make of your answer,

    C: sem_wait()  C--: wait()
       sem_post()       signal()
       sem_t            semaphore()
       sem_init()       initialsem() 
    

    Bear in mind, as stated, I have worked out the problem for 1-restroom only. Since this is homework, I expect you to expand it into the 2-restrooms form yourself.

    Working one's way from the Readers-writers problem to our "Unisex Restroom" problem, we make use of the following global variables:

    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
    

    Incorporating these semaphores & counters into the man thread function,

    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);
    }
    

    Similarly, the woman thread function, substitutes mcount with wcount, msem with wsem, and x with y. Only z remains as is in the man function, so that both man & woman threads queue up on the same common semaphore. (Due to this, the code invariably has FIFO-like behaviour, which ensures fairness/non-starvation)

    The complete code is as follows: (To compile, use gcc filename -lpthread)

    #include 
    #include 
    #include 
    #include 
    
    int mcount,wcount;
    sem_t x,y,z,wsem,msem,cap;
    
    void delay(void)
    {
        int i;
        int delaytime;
        delaytime = random();
        for (i = 0; i

    While converting into the 2-restrooms form, make note of which semaphores & counter variables you would need to duplicate to satisfy all the conditions. Happy semaphoring!

提交回复
热议问题