2011-01-23 14 views
5

मैं बढ़ते क्रम में कुछ संसाधन प्राप्त कर रहा हूं। कौन सा संस्करण बेहतर है? मुझे बताया गया था कि # 2 उच्च संख्या वाले संसाधनों की मांग वाले थ्रेडों के भुखमरी की ओर जाता है। क्या ये सच है? यदि ऐसा है, तो कैसे और क्यों?संसाधन अधिग्रहण और pthreads

a[] sorted array 

1.

for(int i = 1; i < N; ++i) { 
    lock(mutex) 
    while(!resource_available[a[i]]) { 
    pthread_cond_wait(&cond_w[a[i]], &mutex); 
    } 
    resource_available[a[i]] = 0; 
    unlock(mutex) 
} 

2.

lock(mutex) 
for(int i = 1; i < N; ++i) { 
    while(!resource_available[a[i]]) { 
    pthread_cond_wait(&cond_w[a[i]], &mutex); 
    } 
    resource_available[a[i]] = 0; 
} 
unlock(mutex) 

संपादित करें: ऐसा लगता है कि जिस क्रम में आप संसाधनों जारी अंतर है, नहीं ऊपर निर्माणों बनाता है। यदि आप उन्हें छोड़ देते हैं तो आपको उन्हें भुखमरी मिलती है, अगर विपरीत में तो शायद नहीं।

+0

वहां कहीं भी 'अधिग्रहण' (एक [i]) कॉल नहीं होना चाहिए? – caf

+0

मैंने अधिग्रहण जोड़ा। – niteria

+0

http://stackoverflow.com/questions/1162587/what-is-starvation भुखमरी की परिभाषा – niteria

उत्तर

3

दोनों के बाद से केवल दो के बीच में मूल्यांकन भाव है, लगभग बराबर होने का उदाहरण 1 धागा लगभग हमेशा इसे अनलॉक करने के बाद तुरंत सो बिना म्युटेक्स पुनः प्राप्त करेंगे के बाद से, जा रहे हैं।

+0

क्या आप किसी भी तरह से समझा सकते हैं कि क्यों # 2 में कोई भूखा नहीं होगा? – niteria

+0

@niteria: नकारात्मक प्रदान करना कुख्यात रूप से कठिन है। यह इस लूप के अलावा धागे के अलावा क्या करता है - क्या वे किसी भी महत्वपूर्ण समय * नहीं * संसाधनों को पकड़ते हैं? हालांकि, मैं कह सकता हूं कि आपके द्वारा दिए गए दो लूप समतुल्य हैं - एक म्यूटेक्स को अनलॉक करना * नहीं * उपज का मतलब है, और म्यूटेक्स वेटर्स कतारबद्ध नहीं हैं। – caf

+0

आप सही हैं, संसाधनों को जारी करने के क्रम में समस्या थी। क्या आपको पता है कि विपरीत क्रम क्यों मदद करता है? – niteria

2

संसाधन हमेशा उपलब्ध होने पर अधिक भुखमरी का कारण बनेंगे और pthread_cond_wait को चलाने की आवश्यकता नहीं है। उस स्थिति में आप पूरे लूप mutex होगा। तो यदि एन बहुत बड़ा है तो पूरे लूप के बाहर लॉक करके आप अन्य धागे को भूखा कर सकते हैं जिन्हें म्यूटेक्स की आवश्यकता होती है।

अन्य धागे और डेडलॉक्स के भुखमरी से बचने के लिए यह सबसे आम क्षेत्र nescesarry को लॉक करना एक अच्छा विचार है।

इस लूप को बनाए रखने के लिए कोई भी आने पर भी विचार करें। लूप के शरीर में कथन/फ़ंक्शन कॉल करने और अधिक भुखमरी बनाने के लिए यह कुछ अतिरिक्त ग्लोब करने के लिए बहुत आसान होगा। रखरखाव आसानी से कोड में लॉकिंग याद आ सकता है। संसाधन I प्राप्त करने के प्रभारी कार्य बनाकर आप इसे रोकने से सबसे अच्छे हैं। यह फ़ंक्शन सभी लॉकिंग के लिए ज़िम्मेदार होगा, कॉलिंग कोड महत्वपूर्ण अनुभाग के आकार को बढ़ा सकता है।

// blocks till resource resourceNum is obtained 
void acquire_resource(int resourceNum) 
{ 
    lock(mutex) 
    while(!resource_available[a[i]]) { 
     pthread_cond_wait(&cond_w[a[i]], &mutex); 
    } 
    unlock(mutex) 
} 

for(int i = 1; i < N; ++i) { 
    acquire_resource(i); 
} 
+0

लेकिन या तो pthread_cond_wait विज्ञप्ति mutex या धागा सफलतापूर्वक सभी संसाधनों को प्राप्त करता है और फिर mutex जारी करता है। मैं नहीं देखता कि भुखमरी कैसे होती है। – niteria

+0

@niteria - आप सही हैं, मैंने –

+0

के अनुसार अपना जवाब बदल दिया है लेकिन एन सीमित है (मेरे मामले में 100 से कम है) और यदि सभी संसाधन उपलब्ध हैं तो यह सीमित समय में खत्म हो जाता है, इसलिए अंततः म्यूटेक्स के लिए प्रतीक्षा करने वाला थ्रेड इसे प्राप्त करता है। तो भुखमरी नहीं होती है। – niteria

0

मेरे पास resource_available फ़ंक्शन में लॉकिंग और अनलॉकिंग होगा, और उसके बाद प्रतीक्षा करने से पहले ही लॉक करें - इसके ठीक बाद अनलॉक करें।

संबंधित मुद्दे