2011-10-18 19 views
5

के बाद अधिग्रहित किया गया है, मैं का उपयोग कर named_mutex और timeout का उपयोग कर रहा हूं; मैं लिनक्स ओएस में चल रहा हूँ।बूस्ट इंटरप्रोसेस नामक म्यूटेक्स अवशेष

मेरी परीक्षणों में से एक के दौरान मैं एक दुर्घटना थी: तब से, हर मैं फिर से आवेदन चलाने का प्रयास है, यह बिंदु है जहां मैं ताला बनाया पर अटक जाती है; ऐसा लगता है कि म्यूटेक्स कुछ तरीके से अधिग्रहित रहा (इसका उपयोग कर कोई संभावित प्रक्रिया नहीं चल रही है)।

यदि आप नीचे दिए गए कोड को देखते हैं तो मुझे उम्मीद है कि 150 माइक्रोसॉन्ड के बाद, समय scoped_lock मुझे एक त्रुटि देने के लिए लौटाता है .. लेकिन यह मामला नहीं है..यह सिर्फ लटकता है।

  1. कैसे सुनिश्चित करें कि boost::interprocess नामित म्युटेक्स नष्ट हो जाता है बनाने के लिए:

     #include <boost/interprocess/sync/named_mutex.hpp> 
         namespace bi = boost::interprocess; 
         bi::named_mutex m_mutex; 
    
    try{ 
         boost::posix_time::ptime pt( 
          boost::posix_time::microsec_clock::local_time()) ; 
    
         pt+= boost::posix_time::microseconds(150); 
         bi::scoped_lock<bi::named_mutex> lock(m_mutex, pt); 
    
         if(!lock.owns()){ 
         FATAL("I didn't acquire the lock."); 
          return EXIT_FAILURE; 
         } 
        .... 
    

    मेरे सवालों का अनुसरण कर रहे हैं? (तो कैसे प्रक्रियाओं भर में साझा म्युटेक्स को देखने के लिए और कैसे उन्हें नष्ट करने)

  2. क्यों म्युटेक्स 150 माइक्रोसेकंड के बाद वापस नहीं करता है को प्राप्त करने? क्या नीचे दिए गए कोड में कुछ गड़बड़ है?

धन्यवाद एक बहुत

AFG

उत्तर

4

मैं समाधान नहीं मिला: मैं म्युटेक्स

boost::interprocess::named_mutex::remove("MutexName"); 

इस कोड को सभी आवश्यक स्वच्छ बनाता है को नष्ट करने के लिए निम्न कॉल करने के लिए याद किया।

2
boost::interprocess::named_mutex::remove("MutexName"); 

यह सही नहीं होना चाहिए। यह अन्य सभी प्रक्रियाओं के लिए म्यूटेक्स को अनलॉक कर देगा।

1

नाम म्युटेक्स जारी नहीं करेगा जब यूनिक्स पर दुर्घटना, को बढ़ावा देने :: इंटरप्रोसेस :: file_lock आज़मा सकते हैं। जब क्रैश होता है, तो लॉक जारी किया जाता है।

+0

मेरे मामले में यह विंडोज़ पर भी अधिग्रहित रहा –

1

बजाय universal_time() का उपयोग करने का LOCAL_TIME() फ़ंक्शन का उपयोग नहीं करते,: बढ़ावा :: posix_time :: ptime abs_time = बढ़ावा देने :: posix_time :: microsec_clock :: universal_time() + को बढ़ावा देने :: posix_time :: मिलीसेकंड (150);

scoped_lock लॉकर (म्युटेक्स, abs_time);

प्रक्रिया दुर्घटना, तो आप दुर्घटना संकेत को पकड़ने और named_mutex अनलॉक या एक टाइमर के रूप में एक धागा मृत लॉक की जाँच करें और उसे अनलॉक करना चाहिए।

बढ़ावा :: इंटरप्रोसेस :: file_lock नई समस्याओं का उपयोग कर पेश किया जाएगा, ध्यान से !!!

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