मेरे पास एक कक्षा है जिसे कई धागे द्वारा बनाया जा सकता है। लेकिन एक समारोह में कोड को संरक्षित करने की आवश्यकता है, इसलिए मैंने बूस्ट इंटरप्रोसेस म्यूटेक्स का उपयोग करने का फैसला किया। हर वर्ग बनाता है या यह की निर्माता में एक ही Mutex खोलता है:बूस्ट नाम_म्यूटेक्स और निकालें() कमांड
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock");
}
तो अब वहाँ बिंदु है जहां महत्वपूर्ण कोड हिस्सा कहा जाता है आता है:
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
समारोह के बाद साफ करने के लिए (और चाहते अपने बढ़ावा पृष्ठ पर वर्णित) मैं अपने वर्ग नाशक में निकालें आदेश का उपयोग करें:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
वास्तव में सभी के लिए इस कोड, ठीक काम करता है लेकिन इसमें भी एक चिंता का विषय रहा है:
इसे हटाने के आदेश के विवरण में कहा जाता है के रूप में:
सिस्टम से एक नामित म्युटेक्स मिटाता है। त्रुटि पर झूठी वापसी करता है। कभी फेंकता नहीं है।
तो इसका मतलब है कि निकालने का आदेश सिस्टम के बाहर म्यूटेक्स को मिटा देता है - भले ही किसी अन्य धागे ने इसे बंद कर दिया हो (मैंने पहले ही इस मामले को आजमाया है - यह अब लॉक नहीं है)। तो मेरी समस्या यह है: उदाहरण के लिए मेरे पास है 3 धागे (ए, बी और सी) - अब निम्न होता है:
- प्रक्रिया एक वर्ग का एक उदाहरण बनाता है, फ़ंक्शन को कॉल और यह ताले
- प्रक्रिया बी, वर्ग का एक उदाहरण बनाता फ़ंक्शन को कॉल लेकिन कोड का उपयोग नहीं कर सकते हैं (तो इंतजार कर रहा है जैसे)
- प्रक्रिया एक संरक्षित कोड के साथ खत्म और उसे अनलॉक हो जाता है
- प्रक्रिया बी लाभ संरक्षित कोड के लिए उपयोग और इसे
- प्रक्रियाओं को ताला लगाता है रों एक वर्ग के उदाहरण को हटा देता है -> निकालें आदेश में कहा जाता है
- प्रक्रिया सी क्लास का एक उदाहरण बनाता है, फ़ंक्शन को कॉल किया और तब से निकालने के आदेश Mutex मिट कोड का उपयोग कर सकते -> त्रुटि!
तो अब कोई कह सकता है "फिर हटाएं मत!" - क्या यह संभव है? मेरा मतलब है कि name_mutex सिस्टम को लिखता है क्योंकि मुझे संदेह है कि यह एक स्पष्ट कॉल के बिना मिटा दिया गया है, भले ही प्रोग्राम समाप्त हो। किसी को भी कुछ मदद मिली है?
मैं आपके प्रश्न और "थ्रेड" और "प्रक्रियाओं" शब्दों के अंतर-उपयोग से उलझन में हूं। आप किसके साथ काम कर रहे हैं? धागे? या प्रक्रियाओं? नामांकित म्यूटिस में आम तौर पर अत्यधिक सीधी उपयोगिता होती है यदि आप केवल एक ही प्रक्रिया में बहुसंख्यक होते हैं। –
आप इसके बारे में खेद है - लिखते समय मुझे थोड़ा उलझन में मिला। असल में मेरे पास अलग-अलग प्रक्रियाएं हैं। जैसा कि आपने कहा था, केवल धागे के साथ नामित म्यूटेक्स के लिए कोई वास्तविक आवश्यकता नहीं होगी। – Toby