खोज…


वाक्य - विन्यास

  • #ifdef __STDC_NO_ATOMICS__
  • # error this implementation needs atomics
  • #endif
  • #include <stdatomic.h>
  • अहस्ताक्षरित _Atomic काउंटर = ATOMIC_VAR_INIT (0);

टिप्पणियों

C भाषा के भाग के रूप में एटमिक्स एक वैकल्पिक विशेषता है जो C11 के बाद से उपलब्ध है।

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

  • प्रकार: सरणी प्रकार के अपवाद के साथ सभी ऑब्जेक्ट प्रकार _Atomic साथ योग्य हो सकते हैं।

  • ऑपरेटर्स: इन पर सभी रीड-मॉडिफाई-राइट ऑपरेटर्स (जैसे ++ या *= ) को परमाणु होने की गारंटी दी जाती है।

  • संचालन: कुछ अन्य ऑपरेशन हैं जो कि प्रकार जेनेरिक कार्यों के रूप में निर्दिष्ट किए जाते हैं, जैसे atomic_compare_exchange

  • थ्रेड्स: विभिन्न थ्रेड्स द्वारा एक्सेस किए जाने पर उनके लिए एक्सेस की गारंटी है कि वे डेटा रेस का उत्पादन न करें।

  • सिग्नल हैंडलर: परमाणु प्रकार को लॉक-फ्री कहा जाता है यदि उन पर सभी ऑपरेशन स्टेटलेस हैं। उस स्थिति में उनका उपयोग सामान्य नियंत्रण प्रवाह और सिग्नल हैंडलर के बीच राज्य परिवर्तनों से निपटने के लिए भी किया जा सकता है।

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

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

एटमिक्स और ऑपरेटर

परमाणु चर को विभिन्न जातियों के बीच समवर्ती रूप से पहुँचा जा सकता है, बिना दौड़ की स्थिति बनाए।

/* a global static variable that is visible by all threads */
static unsigned _Atomic active = ATOMIC_VAR_INIT(0);


int myThread(void* a) {
  ++active;         // increment active race free
  // do something
  --active;         // decrement active race free
  return 0;
}

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

  • परमाणु वस्तुओं पर परिचालन आम तौर पर सामान्य अंकगणितीय ऑपरेशनों की तुलना में परिमाण के क्रम के होते हैं। इसमें साधारण लोड या स्टोर ऑपरेशन भी शामिल हैं। इसलिए आपको केवल महत्वपूर्ण कार्यों के लिए उनका उपयोग करना चाहिए।
  • सामान्य अंकगणितीय संचालन और असाइनमेंट जैसे a = a+1; पर तीन आपरेशनों वास्तव में a पहले एक लोड है, तो इसके अलावा और अंत में एक दुकान:। यह रेस फ्री नहीं है । केवल ऑपरेशन a += 1; और a++; कर रहे हैं।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow