यथासंभव सरल अपने धागे करें।
वैश्विक चर का उपयोग नहीं करने की कोशिश करो। वैश्विक स्थिरांक (वास्तविक स्थिरांक जो कभी नहीं बदलते) ठीक है। जब आपको वैश्विक या साझा चर का उपयोग करने की आवश्यकता होती है तो आपको उन्हें किसी प्रकार के म्यूटेक्स/लॉक (सेमफोर, मॉनिटर, ...) से बचाने की आवश्यकता होती है।
यह सुनिश्चित करें कि आप वास्तव में समझने की क्या कैसे अपने mutexes काम करें। कुछ अलग-अलग कार्यान्वयन हैं जो अलग-अलग काम कर सकते हैं।
ताकि महत्वपूर्ण वर्गों (स्थानों पर जहां आप लॉक (रों) किसी प्रकार की पकड़) संभव के रूप में जल्दी कर रहे हैं अपने कोड को व्यवस्थित करने के लिए प्रयास करें। पता है कि कुछ कार्यों (नींद या कुछ और पर प्रतीक्षा करें और उस सूत्र कुछ समय के लिए जारी रखने के लिए अनुमति देने से ओएस रखने के लिए) ब्लॉक कर सकते हैं करें। किसी भी ताले को पकड़ते समय इनका उपयोग न करें (जब तक कि पूरी तरह से आवश्यक न हो या डीबगिंग के दौरान कभी-कभी अन्य बग दिखाएं)।
समझने के लिए अधिक धागे वास्तव में आप के लिए करता है की कोशिश करो।किसी समस्या पर अंधेरे से अधिक धागे फेंकना अक्सर चीजों को और खराब करने जा रहा है। विभिन्न धागे सीपीयू और ताले के लिए प्रतिस्पर्धा करते हैं।
डेडलॉक परिहार नियोजन की आवश्यकता है। एक समय में एक से अधिक ताला हासिल करने से बचने के लिए प्रयास करें। यदि यह आदेश देने पर अपरिहार्य है तो आप सभी धागे के लिए ताले हासिल करने और रिलीज़ करने के लिए उपयोग करेंगे। सुनिश्चित करें कि आप जानते हैं कि वास्तव में क्या डेडलॉक का मतलब है।
मल्टी-थ्रेडेड या वितरित अनुप्रयोगों डिबगिंग मुश्किल है। आप एक ही लड़ी वातावरण में डिबगिंग के सबसे कर सकते हैं (हो सकता है यहां तक कि बस अन्य थ्रेड सोने के लिए मजबूर कर रहा) तो आप मल्टी-थ्रेडेड डिबगिंग में कूदने से पहले केंद्रित कीड़े गैर सूत्रण को खत्म करने की कोशिश कर सकते हैं।
उसका हमेशा अन्य थ्रेड अप करने के लिए हो सकता है के बारे में सोचते हैं। इसे अपने कोड में टिप्पणी करें। यदि आप कुछ निश्चित तरीके से कर रहे हैं क्योंकि आप जानते हैं कि उस समय कोई अन्य थ्रेड किसी निश्चित संसाधन तक नहीं पहुंचना चाहिए, तो ऐसा कहने पर एक बड़ी टिप्पणी लिखें।
पूर्णांक my_lock_get (lock_type ताला, स्थिरांक चार * फ़ाइल, अहस्ताक्षरित लाइन, स्थिरांक चार * संदेश) {
thread_id_type me = this_thread();
logf("%u\t%s (%u)\t%s:%u\t%s\t%s\n", time_now(), thread_name(me), me, "get", msg);
lock_get(lock);
logf("%u\t%s (%u)\t%s:%u\t%s\t%s\n", time_now(), thread_name(me), me, "in", msg);
:
आप म्युटेक्स ताले के लिए कॉल रैप करने के लिए चाहते हो सकता है/जैसे अन्य कार्यों में बातें बताता है
}
और अनलॉक करने के लिए एक समान संस्करण। ध्यान दें, इसमें उपयोग किए गए फ़ंक्शंस और प्रकार सभी किसी भी एक एपीआई के आधार पर बनाए गए हैं और अधिकतर नहीं हैं।
इस तरह का उपयोग करने से आप वापस आ सकते हैं यदि कोई त्रुटि है और एक पर्ल स्क्रिप्ट का उपयोग करें या कुछ ऐसा कहने के लिए जैसे कि चीजें गलत हो गई हैं (लॉक से मेल खाता है और उदाहरण के लिए अनलॉक करता है)।
ध्यान दें कि आपके प्रिंट या लॉगिंग कार्यक्षमता के साथ-साथ इसके चारों ओर ताले होने की आवश्यकता हो सकती है। कई पुस्तकालयों में पहले से ही यह बनाया गया है, लेकिन सभी नहीं करते हैं। इन ताले को लॉक_ [get | release] फ़ंक्शंस के प्रिंटिंग संस्करण का उपयोग करने की आवश्यकता नहीं है या आपके पास अनंत रिकर्सन होगा।
बहुत बहुत धन्यवाद लेकिन इन मुद्दों को हल करने के लिए कैसे? – brett
इन सभी समस्याओं को सेमफोर (ताले) के साथ हल किया जा सकता है। आपको सावधानीपूर्वक समझना होगा कि आप पहले क्या कर रहे हैं। थ्रेड के साथ ऐसा करने की कोशिश न करें, वे आपके प्रोग्राम को सामान करने में मदद करने के लिए एक उपकरण हैं, न कि कुछ जादुई चाल जिन्हें आपको जगह पर रखना होगा – Eric