2009-11-08 10 views
6

मैं कुछ सी लाइब्रेरी की तलाश में हूं जिसमें एसटीएम-स्टाइल (सॉफ्टवेयर ट्रांजैक्शनल मेमोरी) हैश मैप्स शामिल हैं, लेकिन अब तक मुझे कोई भाग्य नहीं है। यह बहुत अच्छा होगा अगर यह ग्लिब/गोब्जेक्ट पर आधारित था, लेकिन यह महत्वपूर्ण नहीं है। इसे कई वस्तुओं पर उचित लेन-देन की भी आवश्यकता नहीं है - एक अपरिवर्तनीय हैश समर्थन मुझे वास्तव में चाहिए।सी के लिए एसटीएम हैश लाइब्रेरी (ग्लिब?)

अवश्य होना चाहिए: अपरिवर्तनीय स्नैपशॉट पढ़ें, ऑटो-रीट्री के साथ लॉक-फ्री लिखें।

+0

क्या आपका मतलब एसटीएम के बजाय एसटीएल था? –

+1

मुझे लगता है कि उसका मतलब है एसटीएम - सॉफ्टवेयर ट्रांजैक्शनल मेमोरी - चूंकि वह स्नैपशॉट्स और ऑटो-रीट्री जैसी चीज़ों की तलाश में है: http://en.wikipedia.org/wiki/Software_transactional_memory लेकिन उसे शायद यह स्पष्ट करना चाहिए, क्योंकि एसटीएम एक नहीं है बहुत प्रसिद्ध क्षेत्र। –

+0

विवरण को सही किया गया। माइकल सही है। – viraptor

उत्तर

4

विकिपीडिया में STM implementations की एक सूची है।

+0

मैंने उन लोगों को देखा। लेकिन वे बहुत कम स्तर पर हैं। एकीकरण के लिए सबसे अच्छा संभवतः stmmap है: http://github.com/skaphan/stmmap। लेकिन मैं ऐसा कुछ ढूंढ रहा हूं जिसमें पहले से ही हैशप कार्यान्वयन शामिल है। दुर्भाग्य से मैं यह सुनिश्चित नहीं कर सकता कि कुछ यादृच्छिक डेटा-संरचना लाइब्रेरी केवल एसटीएम लाइब्रेरी के शीर्ष पर उपयोग करने के लिए सुरक्षित है ... मैं उच्च स्तर पर काम करने वाली कुछ पसंद करूंगा। (तैयार डेटा संरचना + एसटीएम समाधान) – viraptor

3

अच्छा, मुझे लगता है (और वहां कई अध्ययन हैं) कि वर्तमान एसटीएम लॉक-फ्री और म्यूटेक्स-आधारित कोड से तेज़ नहीं है। यह स्पष्ट है: एसटीएम को ऑनलाइन डेटा विवाद जांच की आवश्यकता है। हालांकि, शुद्ध सॉफ़्टवेयर में इस तरह के संघर्ष की जांच के लिए बहुत अधिक समय के ऊपर की आवश्यकता होती है। वर्तमान में, केवल सूर्य का ROCK processor हार्डवेयर द्वारा एसटीएम (एसटीएम के साथ सर्वश्रेष्ठ प्रयास एचटीएम) के सीमित रूप का समर्थन करता है। वर्तमान में कोई x86 CPUs हार्डवेयर में टीएम का समर्थन नहीं करता है। संक्षेप में, एसटीएम बस धीमा है।

मेरी राय में, आप बस एक समवर्ती हैश तालिका का उपयोग करना बेहतर होगा। उदाहरण के लिए, आप इंटेल टीबीबी में concurrent_hash_map पा सकते हैं। TBB Manual का लिंक यहां दिया गया है। ओह, लेकिन यह सी ++ है, सी नहीं। लेकिन, मुझे विश्वास है कि आप कर सकते हैं (हालांकि यह महत्वपूर्ण काम ले सकता है) सी ++ - इस तरह की हैश टेबल को सी कोड में अनुवादित करें। इंटेल टीबीबी खुला स्रोत है।

इसके अलावा, मुझे लगता है कि इस तरह के अत्यधिक समवर्ती (आमतौर पर लॉक-फ्री के रूप में लागू) डेटा संरचनाएं हमेशा उपयोगी नहीं होती हैं। कुछ वर्कलोड पैटर्न में, ऐसे डेटा संरचनाओं का उपयोग करना अच्छा नहीं है। यह सुनिश्चित करने के लिए, मैं आपको हैश टेबल के दो संस्करणों के लिए एक छोटा माइक्रो-बेंचमार्क लिखने की सलाह देता हूं: (1) लॉक-फ्री और (2) लॉक-आधारित। साथ ही, कृपया ध्यान रखें कि ऐसे माइक्रो-बेंचमार्क के लिए वर्कलोड पैटर्न वास्तविक के करीब होना चाहिए। एक उदाहरण here में पाया जा सकता है।

+1

मुझे पता है कि वे कभी-कभी धीमे होते हैं। लेकिन वे एक विशिष्ट समाधान में कभी-कभी भी आसान होते हैं। मेरे पास एक बड़ा हैश है जिसे अक्सर पढ़ा जाता है, शायद ही कभी लिखा जाता है। लिखते हैं कि एक लंबा समय लगता है और पहले एक लुकअप की जरूरत है। पाठकों के पूल और 1 लेखक के साथ यह एसटीएम के लिए एक आदर्श मामला है। इसके अलावा, आपको ऑन-लाइन संघर्ष जांच की आवश्यकता नहीं है। आप कई एसटीएम-स्टाइल समाधानों को इस तरह से कार्यान्वित कर सकते हैं कि पाठक कभी भी मानक सीएमपीएक्सएचजी का उपयोग करके इंतजार नहीं करता है और कभी भी ब्लॉक नहीं करता है (और लेखक कभी इंतजार नहीं करता है, हालांकि पुनः प्रयास करने की आवश्यकता हो सकती है)। मेरे लिए यह हर 30 सेकंड-एसएस- एक सिंक्रनाइज़ेशन है जो प्रत्येक 10ms में रीड लॉक को पकड़ता है। – viraptor

+0

मैं आपकी समस्या को समझता हूं। एसटीएम-शैली की बजाय "लॉक-फ्री" डेटा संरचना का उपयोग करना बेहतर है। एसटीएम हमेशा संघर्ष की जांच का मतलब है। आरसीयू के बारे में क्या? http://en.wikipedia.org/wiki/Read-copy-update – minjang

+0

पीएस। मुझे पता है कि concurrent_hash_map को "लॉक-कम" माना जाता है, लेकिन वे लिखते हैं: "क्योंकि किसी तत्व को एक्सेस करने से अन्य धागे अवरुद्ध हो सकते हैं, एक्सेसर या const_accessor के जीवनकाल को कम करने का प्रयास करें।" इस मामले में मेरे लिए पर्याप्त नहीं है। – viraptor

0

TBoost.STM ने इसके उदाहरण में एक हैश मानचित्र लागू किया है।

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