2010-07-22 5 views
12

लगता है कि बूस्ट का shared_mutex गैर रिकर्सिव है .. क्या इसके आसपास वैसे भी है? (पूरी सामग्री को लागू किए बिना)बूस्ट: recursive shared_mutex?

+7

इस पथ से नीचे जाने से पहले, आप रिकर्सिव म्यूटेक्स के बारे में [दूसरों को लगता है] [http://www.zaval.org/resources/library/butenhof1.html) पढ़ना चाहेंगे। –

+1

क्या आपने बढ़ावा दिया है: recursive_mutex? –

+1

हां लेकिन यह साझा नहीं किया गया है – GabiMe

उत्तर

-3

आपको उन मामलों में shared_ptr का उपयोग करना होगा। अपने mutex को shared_ptr में रखें और यह आपके म्यूटेक्स पर फिर से गिनती करेगा, जो आपको समान परिणाम देगा।

+0

एक बढ़ावा :: weak_ptr को बढ़ावा देने से कैसे संबंधित है :: shared_mutex? –

+0

@ सैम क्षमा करें, मैंने कुछ सोचा और पूरी तरह से लिखा। मैंने अपनी पोस्ट को स्पष्ट/सही बनाने के लिए संपादित किया है। – Gianni

+3

'shared_ptr' के पास इस प्रश्न के साथ कुछ लेना देना नहीं है। प्रश्न भौतिक ऑब्जेक्ट को साझा करने के बारे में नहीं है (जिसे 'shared_ptr' अनुमति देता है) लेकिन लॉक के स्वामित्व को साझा और पुन: प्रयोजित करना (सी ++ ऑब्जेक्ट की बजाय सिंक्रनाइज़ेशन अवधारणा)। –

0

बढ़ावा :: रिकर्सिव म्यूटेक्स अनन्य है। मुझे लगता है कि आपको shared_mutex को विस्तारित करने की आवश्यकता होगी। आप वर्तमान थ्रेड आईडी को एक सेट में रख सकते हैं और जांच सकते हैं कि यह लॉक प्रदान करने वाले फ़ंक्शन में सेट में मौजूद है या नहीं।

0

मैं पहले इस सड़क से नीचे गया हूं। सरल जवाब नहीं है, कोई साझा_recursive_mutex नहीं है।

मैं वास्तव में सहमत नहीं हूं कि अन्य लोग आपको बताएंगे कि कैसे म्यूटेक्स आम तौर पर एक बुरा विचार है, यह निश्चित रूप से कुछ समय बचा सकता है और कुछ त्रुटियों को रोक सकता है। हालांकि, अगर आप अपने स्वयं के shared_recursive_mutex को लागू नहीं करना चाहते हैं, तो आपको गैर-रिकर्सिव म्यूटेक्स के साथ रहना होगा। ये इतना भी बुरा नहीं।

7

this thread पर एक नज़र डालें और यह excellent explanation क्यों shared_mutex सामान्य रूप से बुरा विचार है। इसलिए यदि आप सहमत नहीं हैं कि recursive_mutex भी बुरा विचार है, तो इसे बिना किसी तीव्रता के बिना उपयोग करें क्योंकि यह आपको कोई प्रदर्शन बढ़ावा नहीं दे सकता है। आपको किसी भी बड़े बदलाव को थोड़ा क्लीनर कोड w/o प्राप्त होगा।

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

+0

हां। वास्तव में बहुत ही दिलचस्प विश्लेषण। धन्यवाद! – GabiMe

1

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

क्या आप मेरा समर्थन करते हैं या मैं गलत हूं?