कोर्टेक्स एम 3 संचालन के संचालन की एक उपयोगी जोड़ी का समर्थन करता है (आम तौर पर कई अन्य मशीनों में भी) जिसे "लोड-एक्सक्लूसिव" (एलडीआरईएक्स) और "स्टोर-एक्सक्लूसिव" (एसटीआरईआरएक्स) कहा जाता है। वैचारिक रूप से, LDREX ऑपरेशन एक लोड करता है, यह देखने के लिए कुछ विशेष हार्डवेयर भी सेट करता है कि लोड किया गया स्थान कुछ और लिखा जा सकता है या नहीं। अंतिम LDREX द्वारा उपयोग किए जाने वाले पते पर एक STREX निष्पादित करने से वह पता केवल तभी लिखा जा सकेगा जब कोई दूसरा इसे पहले नहीं लिखे । STREX इंस्ट्रक्शन 0 के साथ रजिस्टर लोड करेगा यदि स्टोर हुआ था, या 1 यदि इसे निरस्त किया गया था।
ध्यान दें कि STREX अक्सर निराशावादी होता है। वहाँ स्थितियों की एक किस्म है जहाँ यह दुकान प्रदर्शन नहीं करने का निर्णय ले सकता है, भले ही सवाल में स्थान को छुआ न गया हो। उदाहरण के लिए, LDREX और STREX के बीच एक व्यवधान STREX का कारण बनेगा कि जिस स्थान को देखा जा रहा है वह हिट हो सकता है। इस कारण से, आमतौर पर LDREX और STREX के बीच कोड की मात्रा को कम करना एक अच्छा विचार है। उदाहरण के लिए, कुछ इस तरह से विचार करें:
इनलाइन शून्य safe_increment (uint32_t * addr)
{
uint32_t new_value;
करना
{
new_value = __ldrex (addr) + 1;
} जबकि (__ स्ट्रेक्स (new_value, addr));
}
जो कुछ इस तरह संकलित करता है:
; मान लें कि R0 प्रश्न में पता रखता है; r1 ट्रैश किए गए
एल.पी.:
ldrex r1, [r0]
r1, r1, # 1 जोड़ें
strex r1, r1, [r0]
सीएमपी आर 1, # 0; अगर गैर शून्य
bn lp
.. कोड जारी है
अधिकांश समय कोड निष्पादित होता है, LDREX और STREX के बीच कुछ भी नहीं होगा कि उन्हें "परेशान" किया जाए, इसलिए STREX आगे की हलचल के बिना सफल होगा। यदि, हालांकि, LDREX या ADD निर्देश के तुरंत बाद एक व्यवधान उत्पन्न होता है, तो STREX स्टोर का प्रदर्शन नहीं करेगा, लेकिन इसके बजाय कोड [r0] के (संभवतः अद्यतन किए गए) मान को पढ़ने के लिए वापस चला जाएगा और एक नए संचित मूल्य की गणना करेगा। उस पर आधारित है।
Safe_increment जैसे ऑपरेशन बनाने के लिए LDREX / STREX का उपयोग करना न केवल महत्वपूर्ण अनुभागों को प्रबंधित करना संभव बनाता है, बल्कि कई मामलों में उनकी आवश्यकता से बचने के लिए भी संभव है।