2013-04-09 8 views
6

मैं सोच रहा हूं कि सी ++ 11 में कोई लॉकिंग नीति है जो थ्रेड को भूख से रोकती है।सी ++ में भुखमरी से थ्रेड को कैसे रोकें 11

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

मैं थ्रेड नहीं देना चाहता, एक महत्वपूर्ण खंड छोड़कर, कुछ थ्रेडों को म्यूटक्स को लॉक करने का मौका देने के लिए कुछ न्यूनतम समय के लिए सोना चाहता हूं।

मैंने सोचा कि वहां कुछ पैरामीटर होना चाहिए जो म्यूटेक्स पर प्रतीक्षा धागे के लिए उचित लॉकिंग सक्षम करेगा लेकिन मुझे कोई उचित समाधान नहीं मिला।

अच्छी तरह से मुझे std :: this_thread :: उपज() फ़ंक्शन मिला, जो थ्रेड निष्पादन के क्रम को फिर से निर्धारित करने का अनुमान लगाता है, लेकिन यह शेड्यूलर थ्रेड के लिए केवल संकेत है और शेड्यूलर थ्रेड कार्यान्वयन पर निर्भर करता है यदि यह थ्रेड को फिर से निर्धारित करता है या नहीं।

क्या कोई तरीका है कि सी ++ 11 में उसी म्यूटेक्स पर प्रतीक्षा करने वाले धागे के लिए उचित लॉकिंग नीति कैसे प्रदान की जाए? सामान्य रणनीतियों क्या हैं?

धन्यवाद

+0

http://stackoverflow.com/questions/11666610/how-to-give-priority-to-privileged-thread-in-mutex-locking यह लिंक है जिसे आप मदद कर सकता है !! –

+0

यह एक डिज़ाइन मुद्दा प्रतीत होता है जो थ्रेड भुखमरी मुद्दा नहीं है, क्या आप लोगों को इसे देखने और शायद मदद करने के लिए कोड पोस्ट कर सकते हैं। – dirvine

+0

आपको आम तौर पर एक म्यूटेक्स के लिए प्रतिस्पर्धा करने वाले धागे का समूह नहीं होना चाहिए - यदि आपका कोड वह धारावाहिक है जो केवल एक धागा एक ही समय में काम कर सकता है, तो कम धागे क्यों नहीं हैं? वैध कारण हैं, लेकिन वे सभी वैध कारण नहीं हैं, और उनके पास अलग-अलग उत्तर हो सकते हैं! – Yakk

उत्तर

6

यह बर्बाद कर समय से बचने के लिए कार्य स्विचन जब एक ही धागा फिर म्युटेक्स ले जा सकते हैं डिज़ाइन किया गया mutexes में एक आम अनुकूलन है। यदि वर्तमान थ्रेड में अभी भी समय के टुकड़े में समय शेष है तो आपको उपयोगकर्ता-निर्देश-निष्पादित-प्रति-सेकेंड के मामले में इसे अधिक से अधिक थ्रूपुट मिलता है, इसे इसे निलंबित करने के बजाय म्यूटेक्स लेने और अन्य थ्रेड पर स्विच करने के कारण (जो संभवतः एक कारण बनता है कैश लाइनों और कई अन्य देरी का बड़ा रीलोड)।

यदि आपके पास म्यूटेक्स पर इतना अधिक विवाद है कि यह एक समस्या है तो आपका एप्लिकेशन डिज़ाइन गलत है। आपके पास ये सभी धागे एक म्यूटेक्स पर अवरुद्ध हैं, और इसलिए कुछ भी नहीं कर रहे हैं: आप शायद इतने सारे धागे के बिना बेहतर हैं।

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

एकमात्र ऐसी स्थिति जहां मैं सोच सकता हूं यह एक ठीक परिदृश्य है जहां हर धागा एक शर्त चर पर इंतजार कर रहा है, जिसे तब उन सभी को जागृत करने के लिए प्रसारित किया जाता है। तब प्रत्येक थ्रेड म्यूटेक्स के लिए संघर्ष करेगा, लेकिन यदि आप यह सही कर रहे हैं तो उन्हें सभी को तुरंत जांच करनी चाहिए कि यह एक नकली जाग नहीं है और फिर म्यूटेक्स को छोड़ दें। फिर भी, इसे "थंडरिंग झुंड" स्थिति कहा जाता है, और आदर्श नहीं है, ठीक है क्योंकि यह इन सभी धागे को क्रमबद्ध करता है।

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