2016-09-05 14 views
29

मुझे std::atomic चर के बारे में पता नहीं था, लेकिन मानक द्वारा प्रदत्त std::mutex (अजीब दाएं!) के बारे में पता था; लेकिन एक बात मेरी नजर पड़ी:मानक के परमाणु बूल और परमाणु ध्वज के बीच अंतर

  1. std::atomic<bool> प्रकार

  2. std::atomic_flag प्रकार

: वहाँ दो (मेरे लिए) प्रतीत होता है-एक ही परमाणु मानक द्वारा प्रदान प्रकार, नीचे सूचीबद्ध हैं इसके अलावा std::atomic_flag type -

std: : atomic_flag एक परमाणु बूलियन प्रकार है। Std :: परमाणु के सभी विशेषज्ञों के विपरीत, यह लॉक-फ्री होने की गारंटी है। Std :: atomic के विपरीत, std :: atomic_flag लोड या स्टोर संचालन प्रदान नहीं करता है।

जो मैं समझने में असफल रहा। std::atomic bool type लॉक-फ्री होने की गारंटी नहीं है? तो यह परमाणु नहीं है या क्या?

तो दोनों के बीच क्या अंतर है और मुझे किस का उपयोग करना चाहिए?

+2

"परमाणु" और "लॉक-फ्री" समानार्थी नहीं हैं। आप परमाणु होने के बिना आसानी से लॉक-फ्री हो सकते हैं (ऐसा तब होता है जब आप कोई सिंक्रनाइज़ेशन नहीं करते हैं, उदाहरण के लिए: पी), और आप आसानी से एक परमाणु ऑपरेशन कर सकते हैं जो लॉक-फ्री नहीं है (उदाहरण के लिए, एक का उपयोग करना पर नजर रखने के)। – Luaan

उत्तर

21

std :: परमाणु बूल प्रकार लॉक-फ्री होने के लिए गारंटी नहीं है?

सही। ताले का उपयोग कर std::atomic लागू किया जा सकता है।

तो यह परमाणु नहीं है या क्या?

std::atomic परमाणु है कि इसे ताले या बिना उपयोग किए कार्यान्वित किया गया है या नहीं। std::atomic_flag ताले का उपयोग किए बिना लागू करने की गारंटी है। इसके अलावा ताला मुक्त गारंटी है

तो क्या बी दो

/डब्ल्यू प्राथमिक अंतर अंतर है:

std::atomic_flag लोड या दुकान संचालन प्रदान नहीं करता है।


और जब मैं जो इस्तेमाल करना चाहिए?

आमतौर पर, जब आप परमाणु बूलियन चर की आवश्यकता होती है तो आप std::atomic<bool> का उपयोग करना चाहेंगे। std::atomic_flag एक निम्न स्तर की संरचना है जिसका उपयोग कस्टम परमाणु संरचनाओं को लागू करने के लिए किया जा सकता है।

+2

यदि लक्ष्य आर्किटेक्चर परमाणु संचालन का समर्थन करता है, तो ताले का उपयोग करने का कोई कारण नहीं होगा। लेकिन अगर ऐसा नहीं होता है, तो मुझे आश्चर्य है कि * कैसे * std :: atomic_flag' लागू किया जाएगा? – rustyx

+0

[संपादित करने के लिए] हां क्योंकि लोड और स्टोर बूलियन 'std :: atomic' के साथ प्रासंगिक नहीं हो सकता है लेकिन अन्य प्रकार के साथ होगा। –

+6

@RustyX: सभी मौजूदा आर्किटेक्चर कम से कम परमाणु लोड-एंड-सेट-शब्द (या समकक्ष नकारात्मक लोड-एंड-स्पष्ट-शब्द) का समर्थन करते हैं, जो 'std :: atomic_flag' को लागू करने के लिए पर्याप्त है, लेकिन बहुत कुछ नहीं। पीए-आरआईएससी देखें, जहां 'एलडीसीडब्ल्यू' एकमात्र परमाणु आरएमडब्ल्यू ओप है। – Fanael

18

std::atomic<T> गारंटी देता है कि चर के लिए उपयोग परमाणु होगा। हालांकि यह नहीं कहता कि परमाणुता कैसे प्राप्त की जाती है। यह लॉक-फ्री वैरिएबल का उपयोग कर सकता है, या लॉक का उपयोग कर सकता है। वास्तविक कार्यान्वयन आपके लक्षित वास्तुकला और T पर निर्भर करता है।

std::atomic_flag दूसरी ओर लॉक-फ्री तकनीक का उपयोग करके लागू करने की गारंटी है।

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