Thursday, 15 April 2010

c++ - Creating a mutex class using Allegro mutexes -


मैं एलियग्रे म्यूटक्स (क्रॉस-प्लेटफॉर्म) पर आधारित कस्टम म्यूटक्स क्लास बनाने की कोशिश कर रहा हूं। मैं नहीं सी ++ 11 का उपयोग कर रहा हूँ मैं इसे ऐसा करने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि यह थोड़ा ज़्यादा ज़रूरत नहीं है:

  टेम्पलेट & lt; class T & gt; क्लास म्यूट एक्स {निजी: ALLEGRO_MUTEX * mutex = NULL; ALLEGRO_THREAD * स्वामी = नल; टी * डेटा = नल; सार्वजनिक: म्यूटक्स (); म्यूटक्स (टी * डेटा); ~ म्यूटक्स (); बुल लॉक (ALLEGRO_THREAD * धागा); बुल अनलॉक (ALLEGRO_THREAD * धागा); बूल टॉललॉक (); // यदि आप थ्रेड बूल सेट (T * डेटा, ALLEGRO_THREAD * थ्रेड) को लॉक कर सकते हैं तो यह सही है; बूल प्राप्त (टी ** डेटा, ALLEGRO_THREAD * थ्रेड); // पॉइंटर के पास संदर्भ}   

कन्स्ट्रक्शंस al_create_mutex () को कॉल करेंगे और, दूसरे के मामले में, डेटा पॉइंटर सेट करें। विध्वंसक कॉल al_destroy_mutex ()

लॉक विधि यह देखने के लिए जांच जाएगी कि क्या स्वामी है NULL (mutex का संकेत खुला है और कोई धागा नहीं है)। यदि यह NULL है, तो यह स्वामी = धागा सेट करेगा और म्यूट एक्स लॉक करेगा। अनलॉक विधि, धागा == स्वामी और स्वामी = नल सेट करता है तो म्यूट एक्स अनलॉक करता है।

ट्रालालॉग विधि केवल यह देखने के लिए जांचता है कि क्या स्वामी == NULL , यह इंगित करता है कि म्यूट एक्स को किसी भी थ्रेड से लॉक नहीं किया जाता है।

सेट और प्राप्त करें पद्धतियां सेट और वापस लौटेगी संग्रहीत पॉइंटर, केवल तभी जब कॉलिंग थ्रेड लॉक किए गए म्यूटक्स का स्वामी हो।

मुझे लगता है कि जब भी आप किसी पद्धति को कॉल करना चाहते हैं, मैं पूरी तरह से थ्रेड के साथ थोड़ा सा पानी में जा रहा हूं, लेकिन मैं यह क्लास थ्रेड-सुरक्षित बनाने का कोई अन्य तरीका नहीं देख रहा हूं, क्योंकि एलियग्रे में al_get_current_thread () फ़ंक्शन या ऐसा कुछ नहीं है मुझे इस वर्ग के साथ क्या करना चाहिए?

मैं दृढ़ता से सुझाव देता हूं कि आप एक ऐसा वर्ग बनाते हैं जो केवल अलैग्रो Mutex कार्यक्षमता, और कुछ नहीं करता है फिर एक अलग टेम्प्लेट क्लास बनाओ जो एक डेटा के लिए विशिष्ट एक्सेस प्रदान करने के लिए एक म्यूट एक्स का उपयोग करता है।

Mutex :: owner के लिए आपकी एक्सेस डेटा दौड़ से बचने के लिए सिंक्रनाइज़ेशन की आवश्यकता है। यदि आप वास्तव में पुनरावर्ती और / या टॉकलॉक व्यवहार प्रदान करना चाहते हैं, तो ऐसा करें कि एक अलग कक्षा या कक्षाएं जो अपने कार्यान्वयन में अपने बुनियादी म्यूटक्स का उपयोग करते हैं (संकेत: स्वामी क्षेत्र की रक्षा के लिए एक म्यूटक्स का उपयोग करें और दूसरा ग्राहक को वास्तविक पारस्परिक बहिष्करण प्रदान करने के लिए)।

मुझे संदेह है कि ALLEGRO_THREAD के बिना एक बुनियादी RAII आवरण तर्क है कि वास्तव में आप वास्तव में समाप्त हो जाएगा।

No comments:

Post a Comment