मैं धागे और म्यूटेक्स ताले का उपयोग करके एक चौराहे अनुकरण करने की कोशिश कर रहा हूं।थ्रेड लॉक एक चौराहे सिमुलेटिंग
मेरे पास स्ट्रेट जाने के लिए फ़ंक्शन हैं, बाएं मुड़ें, दाएं मुड़ें। अब, मेरे पास चौराहे के पास आने के लिए एक फ़ंक्शन है। यह एक यादृच्छिक अभिविन्यास उत्पन्न करता है और बारी करता है। प्रत्येक धागा निकट चौराहे साझा करता है।
मेरे पास सभी दिशाओं में सभी कारों के लिए परिभाषित सभी ताले हैं।
चल रहे स्ट्रेट फ़ंक्शन को लें। इसमें एक स्विच स्टेटमेंट है जो उस समय प्रिंट करता है कि कार क्या कर रही है। अब, मुझे यकीन नहीं है कि इस फ़ंक्शन में क्या लॉक करना है। अगर कार उत्तर दिशा में दिशा में है, तो क्या मैं पूर्व और पश्चिम को बंद कर दूंगा और दक्षिण में उत्तर की ओर इशारा करते हुए कार के साथ?
यहाँ मेरी ताले जो सिर्फ एक फ़ंक्शन को कॉल लॉक या अनलॉक
#define NUMCARS 30
#define lock_NW(CAR) lock(CAR, NW_mutex)
#define lock_NE(CAR) lock(CAR, NE_mutex)
#define lock_SW(CAR) lock(CAR, SW_mutex)
#define lock_SE(CAR) lock(CAR, SE_mutex)
#define unlock_NW(CAR) unlock(CAR, NW_mutex)
#define unlock_NE(CAR) unlock(CAR, NE_mutex)
#define unlock_SW(CAR) unlock(CAR, SW_mutex)
#define unlock_SE(CAR) unlock(CAR, SE_mutex)
यहाँ
मुख्य है करने के लिए है
int main(int argc, char **argv){
/* Initial variables*/
int index, tid;
unsigned int carids[NUMCARS];
pthread_t carthreads[NUMCARS];
/* Start up a thread for each car*/
for(index = 0; index <NUMCARS; index++){
carids[index] = index;
tid = pthread_create(&carthreads[index], NULL, approachintersection, (void*)&carids[index]);
}
/* Wait for every car thread to finish */
for(index = 0; index <NUMCARS; index++){
pthread_join(carthreads[index], NULL);
}
printf("Done\n");
return 1;
}
यहाँ
आ चौराहे जो फ़ंक्शन को कॉल स्ट्रेट जा रहा है
static void * approachintersection(void* arg){
unsigned int * carnumberptr;
unsigned int carnumber;
orientation_t cardir = (orientation_t)random()%4;
unsigned long turn = random()%3;
carnumberptr = (unsigned int*) arg;
carnumber = (unsigned int) *carnumberptr;
if(turn==LEFT){
turnleft(cardir, carnumber);
} else if(turn==RIGHT){
turnright(cardir, carnumber);
} else {//straight
gostraight(cardir, carnumber);
}
return (void*)carnumberptr;
}
अब, यहां चलने वाला स्ट्रेट फ़ंक्शन है जहां मैं उचित डायर लॉक करना चाहता हूं ections।
/*
cardirection - The direction the car is pointing. If it is pointing NORTH,
it is starting from the South-Eastern corner of the intersection
and "going straight" means it wants to move SOUTH to NORTH.
valid options: NORTH, SOUTH, EAST, WEST
carnumber - The car identifier
*/
static void gostraight(orientation_t cardirection, unsigned int carnumber){
switch(cardirection){
case NORTH:
printf("Car %d, Moving South-North\n", carnumber);
break;
case SOUTH:
printf("Car %d, Moving North-South\n", carnumber);
break;
case EAST:
printf("Car %d, Moving West-East\n", carnumber);
break;
case WEST:
printf("Car %d, Moving East-West\n", carnumber);
break;
}
}
तो, अगर आ कार दक्षिण से उत्तर की ओर रहे कार एसई कार होगी और मैं lock_SE (सीएआर) के साथ पूर्व के मामले में, पश्चिम प्रिंट समारोह ताला चाहते हैं? अन्य धागे को आने और प्रिंट करने से रोकते हैं? तो मैं प्रिंट स्टेटमेंट अनलॉक लॉक होगा?
या क्या मैं पूरे स्विच स्टेटमेंट को लॉक कर दूंगा?
** संपादित करें: क्या यह ऐसा करने का तरीका होगा? **
static void turnleft(orientation_t cardirection, unsigned int carnumber){
int CAR;
CAR = carnumber;
switch(cardirection){
case NORTH:
lock_SE(CAR)
printf("Car %d, Moving South-West\n", carnumber);
unlock_SE(CAR)
break;
case SOUTH:
lock_NW(CAR)
printf("Car %d, Moving North-East\n", carnumber);
unlock_NW(CAR)
break;
case EAST:
lock_SW(CAR)
printf("Car %d, Moving West-North\n", carnumber);
unlock_SW(CAR)
break;
case WEST:
lock_NE(CAR)
printf("Car %d, Moving East-South\n", carnumber);
unlock_NE(CAR)
break;
}
}
एक मोटे अनाज वाले दृष्टिकोण पूरे चौराहे (स्विच स्टेटमेंट) को लॉक कर देंगे, जिसका अर्थ है कि केवल एक कार एक समय में किसी भी दिशा से चौराहे में प्रवेश कर सकती है।आप शायद एक और अधिक बढ़िया दृष्टिकोण चाहते हैं, जहां प्रत्येक कार चौराहे को रोकने के लिए एक सतत क्रम में चौराहे के एक या अधिक चतुर्भुज (दाएं मोड़ - एक, सीधे - दो, बाएं मोड़ - तीन) को ताला लगा देती है। – twalberg
तो, यदि स्विच केस उस स्विच के अंदर उत्तर है तो क्या मैं अन्य दिशाओं को लॉक कर दूंगा और उसके बाद प्रिंट अनलॉक कर देगा? क्या मैं हर स्विच केस के लिए ऐसा करूंगा? –
मुझे नहीं पता कि यह कैसे करें। क्या आप मुझे डेडलॉक्स के बिना एक उदाहरण दे सकते हैं? –