मुझे पता है, मुझे पता है, मेरे संदेश का शीर्षक उत्तेजक प्रतीत हो सकता है, क्योंकि boost :: mutex purposefuly लॉक/अनलॉक का खुलासा नहीं करता है (मृत से बचने के लिए ताले)।boost :: mutex/अगर mutex लॉक किया गया है तो परीक्षण कैसे करें
हालांकि इन पहलुओं (कम से कम कहने के लिए) में बूस्ट प्रलेखन काफी कम है, इसलिए मैं पूछ रहा हूं कि कोई भी निम्नलिखित उपयोग मामले में मेरी सहायता कर सकता है या नहीं।
मान लीजिए आप एक वर्ग फू, जो है:
- एक नाशक है कि कुछ समय
पूरा करने के लिए लेता है - एक विधि है कि एक अलग धागे से पुकारा जाता है, लेकिन विनाश के दौरान कहा जाता है नहीं किया जाना चाहिए
class Foo
{
public:
virtual ~Foo()
{
//Time consuming operations here
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
//Other time consuming stuff. Should not be called during destruction !
}
};
मैं (कोई सफलता के साथ) की कोशिश की को बढ़ावा देने के आधार पर एक संस्करण :: म्युटेक्स
//boost::mutex implementation
class Foo
{
public:
Foo()
{
}
virtual ~Foo()
{
{
boost::mutex::scoped_lock lock(mDisposingMutex);
//Time consuming operations here
}
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
{
//Imaginary code here: mutex::locked() method is private !!!
if (! mDisposingMutex.locked())
return;
}
//Other time consuming stuff. Should not be called during destruction !
}
private:
boost::mutex mDisposingMutex;
};
मैं हूँ पूरी तरह से गलत लागू करने के लिए? क्या कोई मुझे बता सकता है कि यह boost :: mutex के साथ कैसे किया जाना चाहिए?
धन्यवाद!
क्यों अपनी वस्तु विलुप्त की जा रही है, जबकि एक अन्य धागा अभी भी यह करने के लिए एक सूचक है? –
सीधे सवाल का जवाब नहीं दे रहा है, क्या आप अपने विनाशक में पहले चरण के रूप में 'ऑनटाइमर()' कॉल को उत्तेजित करने वाले पंजीकरण को रद्द कर सकते हैं? अनुमोदित, एक कॉल अभी भी "एक ही समय में" असंकालिक रूप से आ सकता है, लेकिन यह स्पष्ट नहीं है कि क्यों इस वस्तु को विनाश से गुजरना अभी भी इन कॉलबैक के लिए एक लक्ष्य है। – seh
@ आओन: सहमत, यह एक कोड गंध है। हालांकि मुझे अभी भी जवाब में दिलचस्पी है। @ सेह: आपकी टिप्पणी एक ही कोड गंध पर आधारित है। हालांकि, मैं encapsulation तोड़ने के बिना सीधे इसे रद्द नहीं कर सकता। –