के बाद आप को पता है 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);
}
इसी तरह, महिला धागा समारोह, mcount
wcount
, msem
के साथ प्रतिस्थापित करता है, और x
y
के साथ। केवल z
man
फ़ंक्शन में है, ताकि 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-रेस्टरूम रूप में कनवर्ट करते समय, & काउंटर वेरिएबल्स को नोट करें जो आपको सभी शर्तों को पूरा करने के लिए डुप्लिकेट करने की आवश्यकता होगी। हैप्पी सेमफोरिंग!
यह सर्वोत्तम होने की है? –
नहीं, लेकिन इसमें भुखमरी नहीं हो सकती है। इसलिए पुरुषों और महिलाओं को आराम से रेस्टरूम का उपयोग करना पड़ता है। – Jen
मुझे यकीन नहीं है कि क्या आप भुखमरी के बारे में चिंतित हैं, लेकिन मुझे पूरा यकीन है कि आपके एल्गोरिदम में भुखमरी की समस्या है। उस मामले की कल्पना करें जहां एक आदमी दिखाता है, जबकि एक महिला पहले से ही बाथरूम में है, और महिलाओं की एक स्थिर धारा दिखाई दे रही है ताकि बाथरूम कभी खाली न हो। –