2013-01-15 10 views
16

में लॉक फ्री मैप को लागू करने के लिए संभव है। हम नेटवर्क अनुप्रयोग आधारित सी/एस विकसित कर रहे हैं, हम पाते हैं कि std :: map में बहुत सारे ताले जोड़े गए हैं जो सर्वर का प्रदर्शन खराब हो गया है।क्या यह सी ++

मुझे आश्चर्य है कि लॉक-फ्री मानचित्र को लागू करना संभव है, यदि हां, तो कैसे? क्या वहां कोई ओपन सोर्स कोड है?

संपादित करें: असल में हम std :: मानचित्र का उपयोग सॉकेट जानकारी स्टोर करने के लिए, हम सॉकेट फ़ाइल वर्णन के आधार पर कैप्सूलीकरण था इस तरह के आईपी पता, पोर्ट, सॉकेट प्रकार, TCP या UDP, आदि के रूप में कुछ अन्य आवश्यक जानकारी शामिल करने के लिए ।

सारांश करने के लिए

, हम एक वैश्विक मानचित्र कहते हैं कि यह

map<int fileDescriptor, socketInfor*> SocketsMap, 

तो हर धागा जो डेटा भेजने के लिए प्रयोग किया जाता है SocketsMap तक पहुंच की आवश्यकता है है, और वे SocketsMap से पढ़ रहे हैं या SocketsMap पर लिखने से पहले म्युटेक्स जोड़ने के लिए , इस प्रकार पूरे आवेदन के समवर्ती स्तर की वजह से बहुत कम हो जाएगा o सॉकेट्समैप में जोड़ने वाले कई ताले।

समवर्ती स्तर की समस्या से बचने के लिए, हमारे पास दो समाधान हैं: 1. प्रत्येक सॉकेट को * अलग से स्टोर करें 2. किसी प्रकार का लॉक-फ्री मानचित्र का उपयोग करें।

मैं, ताला मुक्त नक्शे के कुछ प्रकार प्राप्त करना चाहते हैं, क्योंकि कोड इस समाधान के अनुसार आवश्यक बदलावों समाधान की तुलना में काफी कम कर रहे हैं 1.

+0

@WozozCraig सभी निष्पक्षता में, यह विशेष रूप से सी ++ कहता है और यह विशेष रूप से सी कहता है ... वे बहुत अलग भाषाएं हैं, खासकर जब आप परमाणु चर पर विचार करते हैं। –

+0

@AlexChamberlain एक उत्कृष्ट बिंदु, महोदय। मैं लिंक yank जाएगा। – WhozCraig

+0

यदि आपको किसी सहयोगी कंटेनर की आवश्यकता है, लेकिन ऑर्डर करने की आवश्यकता नहीं है, तो हैश का उपयोग करना आसान हो सकता है जैसे 'std :: unordered_map'। यह आपके वर्तमान मोटे लॉकिंग के साथ भी तेज़ हो सकता है (विशेष रूप से यदि आप लॉक किए गए हिस्से के बाहर किसी भी महंगी हैश गणना को स्थानांतरित कर सकते हैं), लेकिन मुझे संदेह है कि कभी-कभी महंगी री-हैश आशावादी पुन: संतुलन की तुलना में संभालने में आसान होता है, आशावादी के लिए लॉकफ्री संस्करण। – Useless

उत्तर

14

असल में वहाँ एक रास्ता है, हालांकि मैं इसे अपने आप लागू नहीं किया है प्रतिष्ठित सी ++ विशेषज्ञ आंद्रेई अलेक्जेंड्रेसकू से lock free map using hazard pointers पर एक पेपर है।

+0

यह भी देखें http://libcds.sourceforge.net/ –

+0

ध्यान दें कि खतरे के पॉइंटर्स पेटेंट किए गए हैं, इसलिए हो सकता है कि आप इसे उत्पादन कोड में उपयोग करने में सक्षम न हों। आईपीआर अद्भुत नहीं है? –

+0

धन्यवाद। मैंने अधिक जानकारी जोड़ने के लिए पोस्ट संपादित किया है, क्या आपके पास और सुझाव है? – Steve

1

आप optimistic design या transactional memory का उपयोग कर मानचित्र को लागू कर सकते हैं।

यह दृष्टिकोण विशेष रूप से प्रभावी होता है यदि दो परिचालनों का एक साथ नक्शा को संबोधित करने का मौका होता है और एक इसकी संरचना बदल रहा है अपेक्षाकृत छोटा है - और आप हर बार लॉकिंग के ऊपरी हिस्से को नहीं चाहते हैं।

हालांकि, समय-समय पर टक्कर होगी, और आपको इसे किसी भी तरह से परिणाम देना होगा (आमतौर पर अंतिम स्थिर स्थिति में वापस रोल करके और संचालन को पुनः प्रयास करके)।

अपने हार्डवेयर समर्थन काफी अच्छा परमाणु आपरेशन है - यह आसानी से Compare And Swap (CAS) के साथ किया जा सकता है - जहां संदर्भ अकेले बदल (और जब भी तुम नक्शा बदलने के लिए, आप नक्शे की एक प्रति पर काम करते हैं, और मूल नहीं है, और जब आप प्रतिबद्ध करते हैं तो इसे प्राथमिक के रूप में सेट करें)।

2

हैश मैप उपयुक्त होगा? Intel Threading Building Blocks पर एक नज़र डालें, उनके पास एक दिलचस्प समवर्ती नक्शा है। मुझे यकीन नहीं है कि यह लॉक-फ्री है, लेकिन उम्मीद है कि आप अच्छे मल्टीथ्रेडिंग प्रदर्शन में दिलचस्पी रखते हैं, खासकर लॉक-फ़िरनेस में नहीं।इसके अलावा, आप lib CityHash जांच कर सकते हैं

संपादित करें:

असल TBB के हैश नक्शा ताला मुक्त नहीं है

1

मैं हैरान कोई भी यह उल्लेख किया गया है, लेकिन क्लिक करें क्लिफ लागू किया गया है एक प्रतीक्षा मुक्त hashmap in Java, जो मेरा मानना ​​है कि, सी ++ में पोर्ट किया जा सकता है

2

आप सी ++ 11 का उपयोग करते हैं, तो आप facebook/folly

+0

शायद यह नहीं है कि ओपी क्या चाहता है। जिस मानचित्र से आप लिंक कर रहे हैं वह पूरी तरह से लॉक-फ्री नहीं है। दस्तावेज़ों से: अहरेरे value_type कोशिकाओं का एक निश्चित आकार संगत ब्लॉक है। जब सेल लिखते हैं, तो कुंजी लॉक होती है जबकि शेष रिकॉर्ड लिखा जाता है। –

2

की AtomicHashMap पर एक नज़र हाँ, मैं लागू कर दिया है हो सकता है एक Lock-Free Unordered Map (docs) "स्प्लिट-ऑर्डरर्ड लिस्ट" अवधारणा का उपयोग कर सी ++ में। यह एक ऑटो-विस्तारित कंटेनर है और एबीए मुद्दों के बिना 64-बिट सीएएस पर लाखों तत्वों का समर्थन करता है। प्रदर्शन के अनुसार, यह beast है (पृष्ठ 5 देखें)। लाखों यादृच्छिक ओप के साथ यह extensively tested रहा है।

+0

यह सुंदर लग रहा है। हालांकि, यह क्लैंग पर निर्भर करता है जो रिलीज 3.4 के बाद टूटा हुआ प्रतीत होता है (मैं वर्तमान में 3.7 पर हूं)। यह सिस्टम को फ़ाइल शामिल करने में विफल रहता है। मेरे पास बैंडविड्थ इस शोध के लिए नहीं है। – Nicole

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