2013-02-20 12 views
9

मेरे पास 2 प्रक्रियाएं (ए, बी) समान म्यूटेक्स साझा कर रही हैं (WaitForSingleObject/ReleaseMutex कॉल का उपयोग करके)। सब ठीक काम करता है, लेकिन जब प्रक्रिया ए दुर्घटनाग्रस्त हो जाती है, प्रक्रिया बी खुशी से साथ हमला कर रही है। जब मैं प्रक्रिया ए को पुनरारंभ करता हूं, तो एक डेडलॉक होता है।Win32 नामांकित म्यूटेक्स जारी नहीं किया गया जब प्रक्रिया क्रैश

गहरी जांच से पता चलता है कि प्रक्रिया बी प्रक्रिया ए क्रैश के बाद दो बार रिलीज़म्यूटेक्स() को सफलतापूर्वक कॉल कर सकती है।

मेरी व्याख्या: प्रक्रिया के बाद एक क्रैश, म्यूटेक्स अभी भी बंद है, लेकिन म्यूटेक्स स्थानांतरण का स्वामित्व आसानी से बी (जो एक बग है) को संसाधित करने के लिए स्थानांतरित करता है। यही कारण है कि यह खुशी से साथ हमला कर रहा है, WaitForSingleObject (बदले में WAIT_OBJECT_0 प्राप्त करना) और रिलीज़मैटक्स (बदले में सत्य प्राप्त करना) को कॉल करना।

क्या म्यूटेक्स के समान आदि नामित सिंक्रनाइज़ेशन का उपयोग करना संभव है इस तरह से प्रक्रिया ए में एक क्रैश म्यूटेक्स को छोड़ देगा?

एक समाधान एसईएच का उपयोग करना और दुर्घटना को पकड़ना और म्यूटेक्स को छोड़ना है, लेकिन मुझे उम्मीद है कि विंडोज़ का एक मजबूत आदिम है जो प्रक्रिया दुर्घटना पर ऐसा नहीं है।

+2

यह आपके लिए पढ़ने के लिए एक दिलचस्प लेख हो सकता है: http://blogs.msdn.com/b/oldnewthing/archive/2005/09/12/463977.aspx –

उत्तर

24

कुछ बुनियादी मान्यताओं आप कैसे एक म्युटेक्स विंडोज पर काम करता है के बारे में यहाँ करना है:

  • एक म्युटेक्स एक ऑपरेटिंग सिस्टम ऑब्जेक्ट संदर्भ बार गणना कर रही है। जब तक म्युटेक्स पर पिछले संभाल
  • किसी भी संभाल कि खुली हुई समाप्त हो जाता है जब एक प्रक्रिया ऑपरेटिंग सिस्टम द्वारा बंद कर दिया है बचा है बंद कर दिया है यह गायब नहीं होगा, decrementing संदर्भ गिनती
  • एक म्युटेक्स फिर से प्रवेशी, WaitForSingleObject बुला है एक ही धागे पर एक म्यूटेक्स पर सफल होता है और रिलीजम्यूटेक्स कॉल की समान संख्या के साथ संतुलित होने की आवश्यकता होती है
  • एक स्वामित्व वाली म्यूटेक्स छोड़ दिया जाता है जब थ्रेड का मालिक रिलीज़म्यूटक्स को कॉल किए बिना समाप्त हो जाता है। इस राज्य में एक म्यूटेक्स पर WaitForSingleObject को कॉल करना WAIT_ABANDONED त्रुटि रिटर्न कोड
  • उत्पन्न करता है यह ऑपरेटिंग सिस्टम में कभी भी एक बग नहीं होता है।

तो आप जो देखते हैं उससे आप निष्कर्ष निकाल सकते हैं। एक क्रैश होने पर म्यूटेक्स के साथ कुछ भी नहीं होता है, बी पर अभी भी एक संभाल है। बी का एकमात्र संभावित तरीका यह देख सकता है कि एक दुर्घटनाग्रस्त तब होता है जब ए म्यूटेक्स के स्वामित्व में क्रैश हो जाता है। उस के लिए बहुत कम बाधाएं और आसानी से मनाया जाता है क्योंकि बी डेडलॉक होगा। इससे भी अधिक संभावना यह है कि बी खुशी से मोटर पर चलेगा क्योंकि अब यह पूरी तरह से अनियंत्रित है, अब और कोई भी म्यूटक्स हासिल करने जा रहा है।

इसके अलावा, जब कोई प्रारंभ होता है तो एक डेडलॉक कुछ साबित करता है जिसे आप पहले ही जानते थे: बी किसी कारण से म्यूटेक्स को स्थायी रूप से मालिक बनाता है। संभवतः क्योंकि यह mutex recursively अधिग्रहण किया। आप इसे जानते हैं क्योंकि आपने देखा है कि आपको रिलीजम्यूटेक्स को दो बार कॉल करना था। यह एक बग है जिसे आपको ठीक करने की आवश्यकता है।

आपको क्रैशिंग भाई प्रक्रिया के खिलाफ खुद को बचाने की आवश्यकता होगी और आपको इसके लिए स्पष्ट कोड लिखना होगा।प्रक्रिया ऑब्जेक्ट पर हैंडल प्राप्त करने के लिए भाई पर ओपनप्रोसेस को कॉल करें। प्रक्रिया समाप्त होने पर हैंडल पर एक WaitForSingleObject कॉल पूरा हो जाएगा।

+4

+1 "यह ऑपरेटिंग सिस्टम में कभी भी एक बग नहीं है।" : पी – Deanna

+0

क्षमा करें मैंने इसे एक उत्तर के रूप में ध्वजांकित नहीं किया लेकिन बेहतर देर से कभी नहीं। धन्यवाद, मुझे त्याग किए गए राज्य का अर्थ नहीं पता था। –

9

यदि म्यूटेक्स दुर्घटनाग्रस्त होने वाली प्रक्रिया, तो इसे छोड़ दिया जाता है। यह अन्य अनुप्रयोगों पर निर्भर करता है कि यह इस कार्य के साथ कैसे कार्य करता है प्रतीक्षा कार्यों से लौटाता है।

यदि यह WAIT_ABANDONED वापस आता है तो यह या तो ठीक हो सकता है जैसे कि यह ठीक था (संभवतः यह अब क्या करता है) या "संभावित अस्थिर डेटा, सावधानी के साथ आगे बढ़ें"। स्वामित्व स्वचालित रूप से किसी अन्य प्रक्रिया को पास नहीं किया जाता है।

+10

मेरा अनुमान है कि प्रक्रिया बी को 'WAIT_ABANDONED' प्राप्त होता है' और सोचता है कि इसका अर्थ है 'WAIT_FAILED' ("अप्रत्याशित तरीके से सफल") की बजाय, यह दूसरी बार म्यूटेक्स प्राप्त करने का प्रयास करता है। –

संबंधित मुद्दे