2013-04-30 9 views
31

म्यूटेक्स पर परमाणुओं का उपयोग करने का मुख्य कारण यह है कि म्यूटेक्स महंगे हैं लेकिन atomics के लिए डिफ़ॉल्ट मेमोरी मॉडल के साथ memory_order_seq_cst है, क्या यह महंगा नहीं है?`std :: mutex` के साथ सिंक्रनाइज़ कर रहा है 'std :: atomic (memory_order_seq_cst)' से धीमा है?

प्रश्न: क्या लॉक का उपयोग कर एक प्रोग्राम समवर्ती लॉक-फ्री प्रोग्राम के रूप में तेज़ हो सकता है?

यदि ऐसा है, तो यह प्रयास के लायक नहीं हो सकता है जब तक कि मैं परमाणुओं के लिए memory_order_acq_rel का उपयोग नहीं करना चाहता।


संपादित करें: मैं कुछ लेकिन लॉक-आधारित नहीं कर सकते गायब हो सकता है ताला मुक्त की तुलना में तेजी है क्योंकि प्रत्येक ताला एक पूर्ण स्मृति बाधा भी होना होगा हो। लेकिन लॉक-फ्री के साथ, उन तकनीकों का उपयोग करना संभव है जो मेमोरी बाधाओं के बाद कम प्रतिबंधित हैं।

तो मेरे प्रश्न पर वापस, डिफ़ॉल्ट memory_model के साथ नए सी ++ 11 मानक में लॉक से किसी भी तेज लॉक-फ्री है?

क्या "लॉक-फ्री> = लॉक-आधारित प्रदर्शन में मापा जाता है" सत्य? आइए 2 हार्डवेयर धागे मान लें।


संपादित करें 2: मेरा प्रश्न प्रगति की गारंटी देता है के बारे में नहीं है, और शायद मैं उपयोग कर रहा हूँ संदर्भ से बाहर "ताला मुक्त"।

असल में जब आपके पास साझा स्मृति के साथ 2 धागे होते हैं, और आपको केवल एक ही गारंटी की आवश्यकता होती है कि यदि एक धागा लिख ​​रहा है तो दूसरा धागा पढ़ या लिख ​​नहीं सकता है, मेरी धारणा यह है कि एक साधारण परमाणु compare_and_swap ऑपरेशन बहुत अधिक होगा एक म्यूटेक्स लॉक करने से तेज़।

क्योंकि यदि एक धागा साझा स्मृति को कभी भी छूता नहीं है, तो आप किसी भी कारण से लॉकिंग और अनलॉकिंग समाप्त कर देंगे लेकिन परमाणु संचालन के साथ आप प्रत्येक बार केवल 1 CPU चक्र का उपयोग करेंगे।

टिप्पणियों के संबंध में, बहुत कम विवाद होने पर एक म्यूटेक्स-लॉक बनाम एक स्पिन-लॉक बहुत अलग होता है।

+0

ठीक है, ताले, लॉक-फ्री और प्रतीक्षा-मुक्त कोड के बीच अलग-अलग प्रगति गारंटी है। –

+8

[अनिवार्य पढ़ने] (http://www.1024cores.net/home/lock- फ्री- एल्गोरिदम)। –

+1

घड़ी: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

उत्तर

53

Lockfree प्रोग्रामिंग के बारे में प्रगति की गारंटी देता है है: सबसे मजबूत से सबसे कमजोर करने के लिए, उन प्रतीक्षा मुक्त, ताला मुक्त, बाधा से मुक्त, और अवरुद्ध हैं।

एक गारंटी महंगा है और कीमत पर आता है। जितनी अधिक गारंटी आप चाहते हैं उतना अधिक भुगतान करेंगे। आम तौर पर, एक अवरुद्ध एल्गोरिदम या डेटास्ट्रक्चर (एक म्यूटेक्स के साथ, कहता है) में सबसे बड़ी स्वतंत्रता है, और इस प्रकार संभावित रूप से सबसे तेज़ है। अन्य चरम पर एक प्रतीक्षा मुक्त एल्गोरिदम प्रत्येक चरण पर परमाणु संचालन का उपयोग करना चाहिए, जो बहुत धीमा हो सकता है।

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

संक्षेप में, लॉक- या प्रतीक्षा-मुक्त एल्गोरिदम व्यापार विलंबता और थ्रूपुट के लिए सबसे खराब विलंबता व्यापार करते हैं। सब कुछ धीमा है, लेकिन कुछ भी बहुत धीमी है।यह एक बहुत ही विशेष विशेषता है जो केवल विशिष्ट परिस्थितियों में उपयोगी है (जैसे रीयल-टाइम सिस्टम)।

+0

ठीक है - लेकिन साझा डेटा के साथ 2 धागे .. आप सहमत नहीं हैं कि एक स्पिन-लॉक अवरुद्ध ताला से तेज है? – jaybny

+0

उदाहरण के लिए एक व्यापारिक एप्लिकेशन जो 2 धागे पर 2 एक्सचेंजों से टिकों को सुनता है। मूकक्स के बाद स्पिन-लॉक बहुत तेजी से नहीं होगा? – jaybny

+4

@jaybny: नहीं, क्यों। और एक स्पिनलॉक भी एक ताला है। यह मौलिक गारंटी नहीं बदलता है। और कृपया एक सुखद आश्चर्य के लिए pthread mutex के कार्यान्वयन पर एक नज़र डालें। –

2

एक लॉक को एक साधारण परमाणु संचालन की तुलना में अधिक संचालन की आवश्यकता होती है। सबसे सरल मामलों में, memory_order_seq_cst लॉकिंग के रूप में लगभग दोगुनी हो जाएगी क्योंकि लॉकिंग की आवश्यकता होती है, इसके कार्यान्वयन में कम से कम दो परमाणु संचालन (एक लॉक करने के लिए, अनलॉक करने के लिए)। कई मामलों में, इससे भी अधिक लेता है। हालांकि, एक बार जब आप मेमोरी ऑर्डर का लाभ उठाने लगते हैं, तो यह बहुत तेज हो सकता है क्योंकि आप कम सिंक्रनाइज़ेशन स्वीकार करने के इच्छुक हैं।

इसके अलावा, आप अक्सर देखेंगे कि "लॉकिंग एल्गोरिदम हमेशा लॉक मुक्त एल्गोरिदम के रूप में तेज़ होते हैं।" यह कुछ हद तक सच है। मूल विचार यह है कि यदि सबसे तेज़ एल्गोरिदम लॉक मुक्त होता है, तो लॉक-फ्री गारेनटे के बिना सबसे तेज़ एल्गोरिदम भी एक ही एल्गोरिदम है! हालांकि, यदि सबसे तेज़ अल्गोरिहम को ताले की आवश्यकता होती है, तो लॉकफ्री गारंटी की मांग करने वाले लोगों को धीमे एल्गोरिदम मिलना पड़ता है।

सामान्य रूप से, आप कुछ निम्न स्तर वाले एल्गोरिदम में लॉकफ्री एल्गोरिदम देखेंगे, जहां विशेष ऑपोड्स का लाभ उठाने का प्रदर्शन मदद करता है। लगभग सभी अन्य कोड में, लॉकिंग संतोषजनक प्रदर्शन से अधिक है, और पढ़ने के लिए बहुत आसान है।

+0

"लॉकिंग एल्गोरिदम हमेशा लॉक फ्री एल्गोरिदम के रूप में तेज़ होते हैं।" - मुझे बस यह नहीं मिला। साझा मेमोरी के साथ एक थ्रेड सुरक्षित लूप एक साधारण तुलना_एक्सचेंज करने के बाद एक लॉक (म्यूटेक्स) अनलॉक (म्यूटेक्स) कर रहा है। खासकर यदि किसी अन्य धागे से कभी विवाद नहीं होता है। – jaybny

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