2010-10-03 12 views
7

होमवर्क असाइनमेंट के लिए मुझे निम्नलिखित परिदृश्य को प्रोग्राम करने की आवश्यकता है। यह बीएसीआई (जो सी है) का उपयोग करके सेमफोरों का उपयोग करके किया जा रहा है।सेमफोर और समवर्ती प्रोग्रामिंग

2 यूनिसेक्स विश्राम कक्ष हैं जो प्रत्येक 4 लोगों को पकड़ सकते हैं। चूंकि यह यूनिसेक्स है, वही लिंग के लोग एक ही समय में रेस्टरूम में हो सकते हैं और फीफो महत्वपूर्ण नहीं है। मेरे सिर में 4 पुरुष और 4 महिला को 1 रेस्टरूम के लिए संभालने के लिए मेरे मूल में मूल "एल्गोरिदम" है। लेकिन मुझे नहीं पता कि इसे कैसे कोड करें। किसी भी तरह की सहायता का स्वागत किया जाएगा। यही सब कुछ मेरे पास है।

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. 

इन अतिरिक्त निर्देश

  • प्रदान किया गया उपयोग के लिए छोरों उपयुक्त स्थानों में समय बीतने के अनुकरण करने के लिए यादृच्छिक। यह आसानी से एक देरी समारोह का उपयोग करके किया जा सकता है:

    void Delay (void) 
    { 
        int i; 
        int DelayTime; 
        DelayTime = random (DELAY); 
        for (i = 0; i < DelayTime; i++): 
    } 
    
  • जहां स्थिरांक पूर्णांक देरी = इस तरह से 100

  • प्रिंट और प्रारूप उत्पादन अच्छी तरह से और प्रिंट संदेशों के लिए 10 से कुछ संख्या पढ़ने से कि

    आउटपुट, कोई निष्पादन आदेश का पता लगा सकता है।
  • प्रक्रियाओं को हमेशा के लिए लूप तक सेट करें, और अपने प्रोग्राम को रोकने के लिए नियंत्रण सी (या नियंत्रण ब्रेक) का उपयोग करें।
+0

यह सर्वोत्तम होने की है? –

+0

नहीं, लेकिन इसमें भुखमरी नहीं हो सकती है। इसलिए पुरुषों और महिलाओं को आराम से रेस्टरूम का उपयोग करना पड़ता है। – Jen

+0

मुझे यकीन नहीं है कि क्या आप भुखमरी के बारे में चिंतित हैं, लेकिन मुझे पूरा यकीन है कि आपके एल्गोरिदम में भुखमरी की समस्या है। उस मामले की कल्पना करें जहां एक आदमी दिखाता है, जबकि एक महिला पहले से ही बाथरूम में है, और महिलाओं की एक स्थिर धारा दिखाई दे रही है ताकि बाथरूम कभी खाली न हो। –

उत्तर

0

यहां मेरे पास है। यह बिना किसी डेडलॉक या भुखमरी के एक समय में रेस्टरूम में 1 व्यक्ति की अनुमति देता है। मुझे इसे बनाने के तरीके के साथ सहायता की आवश्यकता है ताकि 4 लोग एक समय में रेस्टरूम में रह सकें।

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

के बाद आप को पता है how to code your algorithm for 1 restroom चाहते हैं, मैंने किया है तो सी में यह एक काफी सरल कार्य यह C-- में परिवर्तित करने के लिए किया जाएगा, के रूप में सभी सेमाफोर निर्माणों काफी समान दिखाई देते हैं।

मैं क्या आपका जवाब के कर सकता है से,

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

याद रखिए, के रूप में कहा गया है, मैं बाहर समस्या 1-टॉयलेट के लिए ही काम किया है। चूंकि यह होमवर्क है, इसलिए मुझे उम्मीद है कि आप इसे 2-रेस्टरूम में स्वयं का विस्तार करें।

हमारे "यूनिसेक्स शौचालय" समस्या का Readers-writers problem से एक की तरह काम करते हुए हमने निम्नलिखित वैश्विक चर का उपयोग करना:

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 

man धागा समारोह में इन संकेतबाहु & काउंटरों शामिल,

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

इसी तरह, महिला धागा समारोह, mcountwcount, msemके साथ प्रतिस्थापित करता है, और xy के साथ। केवल zman फ़ंक्शन में है, ताकि man & woman धागे समान आम सैमफोर पर कतारबद्ध हो जाएं।(संकलन करने के लिए, का उपयोग 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); 
} 
:

पूरा कोड है इस प्रकार है (इस के कारण, कोड सदा ही फीफो की तरह व्यवहार है, जो निष्पक्षता/गैर-भुखमरी सुनिश्चित करता है)

2-रेस्टरूम रूप में कनवर्ट करते समय, & काउंटर वेरिएबल्स को नोट करें जो आपको सभी शर्तों को पूरा करने के लिए डुप्लिकेट करने की आवश्यकता होगी। हैप्पी सेमफोरिंग!

0
4 टॉयलेट Baci कोड के लिए

:

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(); 
} 
     } 
संबंधित मुद्दे