मैं एक लेख या पुस्तक है कि संबोधित करते हैं आप जो खोज रहे हैं के बारे में पता नहीं कर रहा हूँ, इसलिए यहाँ मेरे Windows पर बहु-क्रम डीबगिंग के 12 साल से "सबक सीख लिया" (दोनों अप्रबंधित और प्रबंधित) है।
जैसा कि मैंने मेरी टिप्पणी में कहा गया है, मेरी "बहु-क्रम डिबगिंग" का सबसे वास्तव में एक मैनुअल कोड की समीक्षा के माध्यम से, किया जाता है इन मुद्दों की तलाश में।
गतिरोध और भ्रष्ट साझा राज्य
दस्तावेज़ lock hierarchies (दोनों आदेश और क्या साझा राज्य वे रक्षा), और सुनिश्चित करें कि वे लगातार कर रहे हैं। यह सबसे गतिरोध समस्याओं और भ्रष्ट साझा राज्य की समस्याओं को हल करती है।
(नोट: "लॉक पदानुक्रम" के लिए उपरोक्त लिंक हर्ब सटर द्वारा डॉ डॉब्स लेख को संदर्भित करता है; उन्होंने Effective Concurrency लेखों की एक पूरी श्रृंखला लिखी है जो मैं अत्यधिक अनुशंसा करता हूं)।
पर गतिरोध
उपयोग RAII for all synchronizationअधिक। यह सुनिश्चित करता है कि ताले अपवादों के सामने जारी किए जाते हैं। कोशिश करने के लिए "लॉक" कथन पसंद करें।
(ध्यान दें कि .NET में RAII IDisposable
पर निर्भर करता है, Finalize
नहीं, और मानता है कि क्लाइंट कोड सही ढंग से using
ब्लॉक का उपयोग करेगा)।
भुखमरी
धागा प्राथमिकताओं में से किसी भी संशोधन निकालें।/ओ बाध्य (यूआई धागा सहित) यह सूत्र है कि मैं कर रहे हैं के लिए सबसे अधिक काम के साथ धागा एक निम्न प्राथमिकता करने के लिए उच्च प्राथमिकता देते हैं, और देने के लिए सबसे अच्छा है: सही प्राथमिकता वास्तव में एक सा जवाबी सहज है।चूंकि विंडोज स्वचालित रूप से ऐसा करता है (Windows Internals देखें), वास्तव में कोड शामिल होने का कोई कारण नहीं है।
जनरल में
निकालें सभी ताला मुक्त कोड है कि घर में लिखा गया था। इसमें लगभग निश्चित रूप से सूक्ष्म बग होते हैं। इसे .NET 4 lock-free collections और synchronization objects के साथ बदलें, या लॉक-आधारित होने के लिए कोड बदलें।
सिंक्रनाइज़ेशन के लिए उच्च स्तरीय अवधारणाओं का उपयोग करें। Task Parallel Library और unified cancellation .NET 4 निकालने में काफी किसी भी ManualResetEvent
, Monitor
, Semaphore
के प्रत्यक्ष उपयोग के लिए की जरूरत है, आदि
बनता है के लिए उपयोग उच्च स्तर अवधारणाओं। .NET 4 में TPL and PLINQ में अंतर्निहित समांतरता प्रदान करने के लिए बुद्धिमान विभाजन और कार्य-चोरी कतारों के साथ पूर्ण आत्म-संतुलन वाले एल्गोरिदम अंतर्निहित हैं। कुछ दुर्लभ मामलों के लिए जो स्वचालित समांतरता उप-इष्टतम है, टीपीएल और पीआईएलक्यू दोनों में बड़ी संख्या में ट्विकेबल knobs (कस्टम विभाजन योजनाएं, लंबे समय से चलने वाले ऑपरेशन झंडे इत्यादि) का पर्दाफाश किया जाता है।
एक और तकनीक है जिसे मैंने किसी भी वर्ग के लिए उपयोगी पाया है जिसमें विभिन्न धागे द्वारा बुलाए जाने वाले तरीके हैं: दस्तावेज़ जो विधियों पर चलते हैं। आमतौर पर, इसे विधि के शीर्ष पर एक टिप्पणी के रूप में जोड़ा जाता है। सुनिश्चित करें कि प्रत्येक विधि केवल ज्ञात धागे संदर्भ में चलती है (उदाहरण के लिए, "यूआई थ्रेड पर" या "थ्रेडपूल थ्रेड पर" या "समर्पित पृष्ठभूमि थ्रेड पर")। जब तक आप एक सिंक्रनाइज़ेशन क्लास नहीं लिख रहे हैं (और यदि आप एक सिंक्रनाइज़ेशन क्लास लिख रहे हैं, तो किसी भी विधि को "किसी भी थ्रेड पर" नहीं कहना चाहिए, अगर आप वास्तव में ऐसा कर रहे हैं तो खुद से पूछें)।
अंत में, अपने धागे का नाम दें। वीएस डीबगर का उपयोग करते समय यह आसानी से उन्हें अलग करने में मदद करता है। .NET संपत्ति के माध्यम से इसका समर्थन करता है।
वहां बहुत सारे अच्छे टूल हैं, लेकिन कोड के माध्यम से पढ़ने के सरल दृष्टिकोण को नजरअंदाज न करें। मैं वर्षों से बहुप्रचारित डीबगिंग कर रहा हूं, और यह सबसे प्रभावी तरीकों में से एक है। –
सच है। यह बहुत अच्छी तरह से काम करता है। मैं उपकरण की तुलना में तकनीकों (जैसे 'इस तरह) पर और अधिक देख रहा हूं। – Mau
+1 @ स्टीफन वास्तव में बहुत सच है। –