मेरे पास एक गतिशील बहुप्रचारित कार्यक्रम है जिसमें वृक्ष संरचना में डेटा शामिल है। निम्नानुसार कार्यान्वित:वृक्ष संरचनाएं और धागे
typedef struct
{
// data pertaining to linkages, defining the architecture of the tree
int parent_node;
int child_node[MAX_CHILD_NODES];
int number_of_children;
// data pertaining to info at each node
float interesting_info_A;
char interesting_info_B[STRING_LEN];
long interesting_info_C;
}
node_type;
node_type node[MAX_NUMBER_OF_NODES];
CRITICAL_SECTION node_critsec[MAX_NUMBER_OF_NODES];
कार्यक्रम node_critsec [] द्वारा नियंत्रित महत्वपूर्ण अनुभागों में प्रवेश करता है और छोड़ देता है। तो जब मुझे node n के interesting_info_A/B/C को संसाधित करने की आवश्यकता होती है तो मैं उस नोड (node_critsec [n]) का महत्वपूर्ण खंड दर्ज करता हूं, मेरी प्रसंस्करण करता हूं और फिर छोड़ देता हूं। यह कार्यक्रम पेड़ के चारों ओर घूमता है जो माता-पिता और बच्चों के लिंक के बाद जटिल पथों के सभी प्रकार लेता है। कार्यक्रम पेड़ भी उगाएगा, यानी नए नोड्स जोड़ें और तदनुसार अन्य नोड्स के माता-पिता/बच्चों के लिंक को संशोधित करें (पेड़ कभी भी कम नहीं होता है)। मैं कोशिश करता हूं और सुनिश्चित करता हूं कि प्रत्येक थ्रेड केवल डेडलॉक्स के जोखिम से बचने के लिए एक नोड को ताला लगा देता है। लेकिन फिर मुझे एक समस्या है- अगर मैं एक नया नोड जोड़ रहा हूं तो मैं नोड के माता-पिता को लॉक करना चाहूंगा ताकि मैं बच्चों की सूची समायोजित कर सकूं। बिना किसी डेडलॉक्स के काम करने के लिए सभी को प्राप्त करना या एक ही नोड में डेटा को संशोधित करने का प्रयास करने वाले दो थ्रेड एक दुःस्वप्न का थोड़ा सा हो रहा है। क्या कोई मार्गदर्शक सिद्धांत है जिसके बारे में मुझे निम्नलिखित और किस नोड्स को लॉक/अनलॉक करना है, इसके बारे में निम्नलिखित होना चाहिए - या क्या मुझे बस सुपर-स्मार्ट होना चाहिए और घटनाओं के हर क्रमपरिवर्तन को काम करना चाहिए?
क्या आप समझा सकते हैं कि आप डेडलॉक्स का सामना कर रहे हैं? इसका तात्पर्य है कि या तो आपके ग्राफ में (पेड़ नहीं) या ट्रैवर्सल के दौरान आप बच्चे लॉक प्राप्त करने से पहले पैरेंट लॉक नहीं छोड़ रहे हैं, जो सही करने के लिए बहुत आसान होगा। –
जहां तक मैं इसे समझता हूं, कुछ एल्गोरिदम नीचे-नीचे जाते हैं, जबकि अन्य ऊपर-नीचे जाते हैं, और इसी तरह। मुझे लगता है कि उसका मतलब है कि उसे माता-पिता की सूची में जोड़ने से पहले नए नोड को लॉक रखना होगा अन्यथा कोई अन्य धागा नए नोड को चुरा सकता है या घबरा सकता है (असंगत स्थिति: parent_node एक नोड पर सेट है जो इसे सूचीबद्ध नहीं करता है बच्चे के रूप में नोड)। मुझे नहीं पता कि यह डेटा-संरचना इष्टतम है, लेकिन वह इस के साथ सिंक्रनाइज़ेशन की आवश्यकता के संबंध में सही मानता है। – gimpf
@ टायलर मैकहेनरी: मुझे वास्तव में डेडलॉक्स नहीं मिल रहे हैं, हालांकि मेरे पास अतीत में है। जिन बार मैंने उन्हें प्राप्त किया था, वे हमेशा एक ही समय में दो अलग-अलग नोड्स को लॉक करने वाले धागे में से एक थे। मेरी समस्याएं अब उस प्रकार के हैं जहां दो अलग-अलग धागे एक ही नोड्स डेटा को संसाधित कर रहे हैं। – Mick