2009-02-19 10 views
9

मैं क्लाइंट सर्वर एप्लिकेशन पर काम कर रहा हूं। कुछ समय पर, कुछ मशीनों पर, जब डेटा से अनुरोध करने वाले 5 से अधिक ग्राहक हैं, तो ऐसा लगता है कि यह एक डेडलॉक तक पहुंच गया है। यदि मैं समस्या को डीबग करने के लिए कदम उठाता हूं, तो प्रोग्राम प्रसंस्करण प्रतीत होता है। बस एक ब्रेक पॉइंट सेट करना जहां मुझे पता है कि प्रोग्राम निष्पादित हो रहा है, और ब्रेकपॉइंट को मारने के कारण इसे कुछ बार समाप्त करना पड़ता है। अगर मैं कोड में कुछ बिंदुओं पर थ्रेड स्लीप (0) डालता हूं, ज्यादातर सीपीयू गहन लूप के आसपास, ऐसा लगता है कि यह समस्या को पूरी तरह से हल करता है। मेरे पास अब एक समस्या यह है कि अगर मैं थ्रेड कहता हूं। नींद (0) बहुत अधिक है, तो यह कोड को धीमा कर सकता है। अगर मैं इसे पर्याप्त नहीं कहता, तो कोड डेडलॉक में प्रतीत होता है। हालांकि मैं यह सत्यापित कर सकता हूं कि यह डेडलॉक में नहीं है क्योंकि यदि मैं कोड में कदम रखता हूं, तो यह समस्या गायब हो जाती है, क्योंकि बस मैं धागे को रोक रहा हूं।थ्रेड क्यों करता है। नींद (0) मेरी समस्याओं को ठीक करें, और इससे कैसे बचें?

क्या इसका कारण यह पता लगाने का एक अच्छा तरीका है कि इसका क्या कारण है। ऐसा लगता है कि यह केवल मेरे लैपटॉप पर होता है जो Vista चला रहा है, लेकिन मेरे डेस्कटॉप पर नहीं जो Windows XP चला रहा है। हालांकि, डीबग करना असंभव है, क्योंकि कोड में बस कदम उठाने से समस्या दूर हो जाती है। मैंने टिप्पणियां पढ़ी हैं जो थ्रेड को बुला रही हैं। नींद (0) एक बुरी प्रथा है, और यह जरूरी नहीं है, और मुझे अपने अनुप्रयोगों में जादूगर प्रकार कोड डालना पसंद नहीं है जो मुझे समझ में नहीं आता कि उसे वहां क्यों होना है । किसी भी प्वाइंटर की अत्यधिक सराहना की जाएगी।

[संपादित करें] मैं यह भी सत्यापित कर सकता हूं कि कोड "डेडलॉक" होने पर भी चल रहा है क्योंकि अगर मैं इसे काफी देर तक छोड़ देता हूं, तो यह खत्म हो जाएगा, केवल उतना ही समय जितना अधिक होता है, उतना ही अधिक मात्रा में होता है। मेरा मतलब है कि यह वास्तव में कम से कम 100 गुना धीमा है जब यह इस "deadlocked" मोड में है। सीपीयू 80-95% पर आंका गया है, इसलिए यह काम कर रहा है, जो कुछ भी कर रहा है वह मेरे बाहर है, क्योंकि यह कार्य को पूरा करने के लिए हमेशा के लिए ले रहा है।

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

+0

क्या आप कोड पोस्ट कर सकते हैं? – Shawn

+0

क्षमा करें, पोस्ट करने के लिए बहुत सारे कोड, और ऐसा कुछ ऐसा प्रतीत नहीं होता है जिसे मैं केवल थोड़ी सी कोड के साथ पुनः बना सकता हूं। – Kibbee

+0

क्या वह मशीन है जो मल्टी-सीपीयू समस्या को प्रदर्शित करती है और वह एक जो एकल सीपीयू नहीं करता है? यह कई बहु थ्रेड संसाधन विवाद मुद्दों का पर्दाफाश कर सकता है। – zdan

उत्तर

1

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

11

थ्रेड। नींद (0) एक उपज है। मैं कुछ मुद्दों से बचने के लिए कॉल करने के तरीके को पुन: व्यवस्थित कर रहा हूं। मुझे लगता है कि अगर आपने उपज के साथ कोड जारी किया और इसे 1000 मशीनों पर चलाया, तो आपको बहुत सारी बग रिपोर्ट मिलेंगी। मुझे लगता है कि आपको अपने मृत लॉक से बचने के लिए कुछ प्रकार के लॉक/महत्वपूर्ण अनुभाग की आवश्यकता है क्योंकि कुछ जहां आपका कोड थ्रेड सुरक्षित नहीं है। यह एक पुस्तकालय में हो सकता है जिसे आप बुला रहे हैं।

  1. लॉगिंग में जोड़ें और देखें कि समस्याएं अभी भी होती हैं या नहीं। उम्मीद है कि आप यह पता लगा सकते हैं कि मृत लॉक
  2. कुछ महत्वपूर्ण अनुभाग जोड़ें। एक विभाजन का उपयोग करता है और दृष्टिकोण जीतता है, जिससे आप समस्या को हल करने में सक्षम होना चाहिए।
+4

दूसरे शब्दों में, 'नींद (0)' शायद दौड़ की स्थिति को मास्क कर रहा है। – SamB

4

संपूर्ण कोडबेस को देखे बिना जवाब देना असंभव है।

कॉलिंग थ्रेड।नींद एक हॉरिबल अभ्यास है, और आपको यह नहीं करना चाहिए। आप मूल रूप से अपने कोड के समय के आसपास स्थानांतरित हो रहे हैं जो डेडलॉक की ओर अग्रसर है, क्योंकि वास्तव में डेडलॉक स्थिति को संबोधित करने के विरोध में।

कारण यह है कि डिबगिंग समस्या नहीं दिखाती है कि जब डीबगर बंद हो जाता है, तो आपके कोड में मौजूद सभी थ्रेड बंद हो जाते हैं, जिससे आपके प्रोग्राम के निष्पादन के समय को भी कम किया जा रहा है।

आप यहां क्या करना चाहते हैं यहां विभिन्न कोडों पर अपने कोड के निष्पादन के पथ का पता लगाने के लिए लॉगिंग कोड डालना है, और उस पर आधारित, निर्धारित करें कि डेडलॉक कहां है।

1

मुझे लगता है कि यह आपके लिए कंप्यूटर से और व्हाइटबोर्ड तक जाने का समय है। विश्लेषण करें कि प्रत्येक तत्व लॉकिंग कैसे होता है और किस स्थिति में यह लॉक सावधानीपूर्वक जारी करता है। पांच धागे एक मुश्किल समस्या हो सकती है, तो शायद देखें कि केवल दो धागे एक ही स्थिति का कारण बन सकते हैं। कुछ ठीक से लॉक नहीं हो रहा है और आपको कहां मिलना है।

जब तक आपका कोड इस प्रयास के लायक नहीं है, तो वहां थ्रेड.sleep() को छोड़ दें, क्योंकि इससे चीजों की भव्य योजना में वास्तव में आपके प्रदर्शन को बहुत नुकसान नहीं पहुंचाता है।

3

उस लूप के अंदर क्या है? यदि आप एक पाश में कुछ क्षेत्र की जाँच करेगा एक से अधिक थ्रेड सिंक्रनाइज़ करने के लिए इसी तरह की समस्याओं दिखाई दे सकता है:

while (_field); // waiting for _field change in another thread 

यह समाधान बहुत धीमी गति से काम करेंगे और Thread.Sleep करने के लिए कॉल (0) एक समाधान नहीं है, लेकिन एक हैक हो सकता है कुछ मामलों में। यदि आप कुछ सिंक्रनाइज़ेशन ऑब्जेक्ट (ManualResetEvent उदाहरण के लिए) के WaitHandle.WaitOne() विधि को कॉल करके उस सिंक्रनाइज़ेशन लूप को ठीक से ठीक किया जा सकता है और इस हैंडल को किसी अन्य थ्रेड में सिग्नल डालें। शायद आपकी समस्या ऐसा कुछ है? कृपया अपने कोड का कुछ हिस्सा प्रदान करें।

1

आपके पास निश्चित रूप से थ्रेडिंग समस्याएं हैं जिन्हें संबोधित करने की आवश्यकता है। कॉलिंग थ्रेड। नींद (0) शेड्यूलर को लात मारने का कारण बनती है। यह शायद प्रत्येक थ्रेड को चीजों को काम करने के लिए पर्याप्त चलाने का मौका देता है। मैं वहां केवल नींद नहीं छोड़ूंगा और इसे छोड़ दूंगा क्योंकि वे ऐसी चीजें हैं जो थोड़ी देर के लिए काम करती हैं और फिर पूरी तरह से असंबंधित परिवर्तन टूटने वाली चीज़ों को समाप्त करता है।

1

जब तक हार्डवेयर आपको मजबूर नहीं करता है, आपको कभी भी नींद() का उपयोग नहीं करना चाहिए।

किसी समस्या के बारे में सोचने का प्रयास करें। विचार करें कि डेटा को थ्रेड के बीच साझा करने की आवश्यकता है और डेटा साझा करने के तरीकों के बारे में सोचें (IE, इसे कॉपी करें) एक्सेस साझा करने के बजाय इच्छुक पार्टियों को .. यदि आप यह सही करते हैं, तो आपको वास्तव में किसी भी म्यूटेक्स की आवश्यकता नहीं हो सकती है ...

याद रखें, विभिन्न चरों पर स्थानीय चर मौजूद हैं, लेकिन कार्यों के भीतर स्थिरता अनिवार्य रूप से ग्लोबल्स हैं (और निश्चित रूप से, आपको अपने ग्लोबल्स पर बारीकी से देखने की आवश्यकता है)।

+0

आपको कभी नींद का उपयोग नहीं करना चाहिए? नींद (0) गेम लूप जैसी चीजों के लिए उपयोगी है जहां आप जितना कर सकते हैं उतना प्रोसेसर जितना कर सकते हैं, अन्य सिस्टम प्रक्रियाओं को अवरुद्ध किए बिना। – FryGuy

0

शायद Typemock Racer जैसे टूल का उपयोग करने का प्रयास करें?

अस्वीकरण: मैंने पहले कभी उस उपकरण का उपयोग नहीं किया है।

2

जब यह नीचे गिरता है तो कितने एक साथ थ्रेड चल रहे हैं? यदि आपके पास बहुत सारे धागे हैं, तो सीपीयू संदर्भ स्विचिंग करने में अपना पूरा समय व्यतीत कर सकता है। इसके अलावा, आप प्रति थ्रेड मेमोरी के 1+ एमबी के माध्यम से चबाना होगा।

0

हाँ, आपको शेड्यूलर ओवरलोड का सामना करना पड़ सकता है।

मैं ईमानदारी से आशा नहीं करता हूं।

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