c++ - Is there PTHREAD_MUTEX_ROBUST equivalent in Mac OS X? -
मैं एक साझा मेमोरी पर म्यूटक्स शायद डेडलॉक हो सकता है अगर कोई प्रक्रिया बाहर निकलती है, लेकिन म्यूट एक्स लॉक हो जाती है। पॉसिक्स मानक में एक क्या मैक ओएस एक्स पर किसी प्रकार का मजबूत सामग्री पीओएसआईएस धागे (एसयूएसयू 7) के बाद के पुनरावृत्त में दिखाई दी, मैक ओएस एक्स (जो कि एसयूएस 2) द्वारा समर्थित मानक का हिस्सा नहीं है। एप्पल डॉक्स नहीं दिखाते हैं एक वॉचडॉग प्रभावी रूप से म्यूटक्स को लॉक और अनलॉक करता है हर पांच सेकंड में, हर बार एक चर बढ़ाना यदि, किसी कारण के लिए, आपको डेडलॉक मिलता है, इस बीच, वॉचडॉग तब से बाहर निकल सकता है और संभवतः जो भी कोड आपके पास पहले से ही पूरा आवेदन शुरू करने के लिए है, वह किसी बिंदु पर लाएगा। या आप निगरानी रखने वाली प्रक्रिया को बाहर निकलने से पहले किसी प्रकार की चेतावनी बढ़ा सकते हैं ताकि यह सुनिश्चित हो सके कि समस्या को देखा जा सके। वॉचडॉग प्रक्रिया के पीछे का विचार यह संभव के रूप में सरल बनाने के लिए है, जहां यह सिद्ध है (या अपने गुमराह कार्यक्रम से कम से कम अधिक)। इसमें कोई संदेह नहीं है कि आपके समग्र वास्तुकला के आधार पर कई अन्य संभावनाएं हैं। मैंने आपको ये सोचने के लिए कुछ देने के लिए मेरे सिर के ऊपरी हिस्से से ये कुछ ही प्रदान किया है। pthread_mutex_t से
PTHREAD_PROCESS_SHARED का उपयोग कर रहा हूं विभिन्न प्रक्रियाओं के बीच सिंक्रनाइज़ेशन करने के लिए।
PTHREAD_MUTEX_ROBUST है। लेकिन ऐसा लगता है कि मैक ओएस एक्स
PTHREAD_MUTEX_ROBUST का समर्थन नहीं करता।
mutex है जो कि साझा मेमोरी, और क्रॉस प्रोसेस को सिंक्रनाइज़ करने के लिए इस्तेमाल किया जा सकता है, और इसे अनलॉक किए बिना एक प्रक्रिया मरने के मामले में मजबूत होना चाहिए?
pthread_mutexattr_setrobust फ़ंक्शन (या इसकी समतुल्य
प्राप्त करें ) और वे कहते हैं कि वे SUSv2 पर आधारित हैं, इसलिए बताते हैं कि आपके पास यह क्यों नहीं है। < P> समस्या के फिक्सिंग के संदर्भ में, आप कुछ ऐसे नियमों को ध्यान में रख सकते हैं जैसे आपके एक्सिसिंग प्रोग्राम के संसाधनों को खाली करने के लिए एक
atexit हैंडलर का उपयोग करें। < P> या एक अन्य संभावना है कि डेडलॉक को बाहरी रूप से मॉनिटर करना है और अगर कोई समस्या मिलती है तो साफ हो जाती है। उदाहरण के लिए, निम्न पंक्तियों के साथ दो धागे के साथ एक निगरानी प्रक्रिया है।
thread1: सेट चर gloabalNum और localNum को शून्य करने के लिए thread2 प्रारंभ करें, जबकि: 60 सेकंड नींद यदि globalNum == स्थानीय नम्बर: बाहर निकलें End = स्थानीय नाम = globalNum समाप्त होने पर mutex का उपयोग कर सभी प्रक्रियाओं को मारते समय साझा किए गए मेमोरी निकास प्रक्रिया thread2: जब सही है: ताला म्यूट एक्स अनलॉक म्यूट एक्सक्लूसमेंट ग्लोबल न्यूम स्लीप 5 सेकंड
thread2 रुक जाएगा और चर को कभी भी अपडेट नहीं किया जाएगा।
thread1 को चेक कर रहा है सुनिश्चित करें कि
thread2 अभी भी चल रहा है, चर प्रति अपनी प्रतिलिपि प्रति स्थानीय जाँच के द्वारा चलाकर। यदि यह पता चलता है कि वे वही हैं, तो यह मानता है कि
thread2 गतिरोध के कारण रुका हुआ है और यह तब सभी प्रक्रियाओं को बंद कर देता है जो म्यूटक्स का उपयोग करके और इसे नष्ट कर (साझा स्मृति को हटा कर) नष्ट कर देता है। / P>
Comments
Post a Comment