मुझे हार्डवेयर के एक टुकड़े के आसपास इंटरप्रोसेस सिंक्रनाइज़ेशन की आवश्यकता है। चूंकि इस कोड को विंडोज और लिनक्स पर काम करने की आवश्यकता होगी, इसलिए मैं बूस्ट इंटरप्रोसेस म्यूटेक्स के साथ लपेट रहा हूं। म्यूटक्स के त्याग की जांच के लिए सब कुछ मेरी विधि को अच्छी तरह से स्वीकार करता है। ऐसी संभावना है कि यह हो सकता है और इसलिए मुझे इसके लिए तैयार रहना चाहिए।इंटरप्रोसेस म्यूटेक्स को बढ़ावा दें और त्याग के लिए जांच
मैंने अपने परीक्षण में म्यूटेक्स को छोड़ दिया है और, निश्चित रूप से पर्याप्त है, जब मैं mutex को लॉक करने के लिए scoped_lock का उपयोग करता हूं, प्रक्रिया अनिश्चित काल तक अवरुद्ध होती है। मैंने सोचा कि स्कोप्ड_लॉक पर टाइमआउट तंत्र का उपयोग करके इस तरह का तरीका है (क्योंकि समय के लिए गुगलिंग के लिए गुगलिंग खर्च करने के लिए वास्तव में बहुत कुछ नहीं दिखाया जाता है, पोर्टेबिलिटी कारणों से बूस्ट इसके आसपास बहुत कुछ नहीं करता है)।
आगे की हलचल के बिना, यहाँ मैं क्या है:
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
typedef boost::interprocess::named_recursive_mutex MyMutex;
typedef boost::interprocess::scoped_lock<MyMutex> ScopedLock;
MyMutex* pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
{
// ScopedLock lock(*pGate); // this blocks indefinitely
boost::posix_time::ptime timeout(boost::posix_time::microsec_clock::local_time() + boost::posix_time::seconds(10));
ScopedLock lock(*pGate, timeout); // a 10 second timeout that returns immediately if the mutex is abandoned ?????
if(!lock.owns()) {
delete pGate;
boost::interprocess::named_recursive_mutex::remove("MutexName");
pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
}
}
, यही कारण है कि कम से कम, विचार है। तीन दिलचस्प अंक:
- जब मैं टाइमआउट वस्तु नहीं का उपयोग करते हैं , और म्युटेक्स छोड़ दिया जाता है, ScopedLock ctor ब्लॉक अनिश्चित काल के लिए। यह उम्मीद है।
- जब मैं समय-समय पर का उपयोग करता हूं, और म्यूटेक्स छोड़ दिया जाता है, स्कोप्ड लॉक सीटीआर तुरंत लौटता है और मुझे बताता है कि यह म्यूटेक्स का मालिक नहीं है। ठीक है, शायद यह सामान्य है, लेकिन यह 10 सेकेंड का इंतजार क्यों नहीं कर रहा है, मैं इसे भी बता रहा हूं?
- जब म्यूटेक्स को छोड़ दिया नहीं गया है, और मैं टाइमआउट का उपयोग करता हूं, स्कोप्ड लॉक सीटीओ अभी भी तुरंत लौटता है, मुझे बता रहा है कि यह लॉक नहीं कर सकता है, या म्यूटेक्स का स्वामित्व ले सकता है और मैं हटाने की गति से गुजरता हूं म्यूटेक्स और इसे रीमेकिंग। यह वही नहीं है जो मैं चाहता हूं।
तो, इन वस्तुओं का उपयोग करने में मुझे क्या याद आ रही है? शायद यह मुझे चेहरे पर देख रहा है, लेकिन मैं इसे नहीं देख सकता और इसलिए मैं मदद मांग रहा हूं।
मुझे यह भी उल्लेख करना चाहिए कि यह हार्डवेयर कैसे काम करता है, अगर प्रक्रिया 10 सेकंड के भीतर म्यूटेक्स के स्वामित्व को प्राप्त नहीं कर पाती है, तो म्यूटेक्स को छोड़ दिया जाता है। वास्तव में, मैं शायद 50 या 60 मिलीसेकंड जितना कम इंतजार कर सकता हूं, लेकिन 10 सेकंड उदारता का एक अच्छा "दौर" संख्या है।
मैं विंडोज 7 पर संकलन कर रहा हूँ दृश्य स्टूडियो का उपयोग कर 2010
धन्यवाद, एंडी
आपके प्रश्न से संबंधित नहीं है, लेकिन आपके उदाहरण में 'reinterpret_cast 'की आवश्यकता नहीं है (सुनिश्चित नहीं है कि वे वहां क्यों हैं)। –
@GaborMarton मुझे लगता है कि मैं निकालने() फ़ंक्शन का सही उपयोग कर रहा हूं। कोड फिर से जांचें। मैं सूचक को हटा रहा हूं, जो मैं सहमत हूं, म्यूटेक्स को नहीं हटाता है, लेकिन फिर मैं कॉल बूस्ट :: इंटरप्रोसेस :: name_recursive_mutex :: हटाएं ("MyMutex")। अगर मैंने इसका गलत इस्तेमाल किया है, तो कृपया मुझे सही करें। धन्यवाद –
हाँ, आप सही हैं, बस मेरी टिप्पणी हटा दी, और मेरा जवाब अपडेट किया। उम्मीद है की वो मदद करदे। –