नहीं, मुझे नहीं लगता कि आप कभी भी ++volatile_var
परमाणु होने की उम्मीद कर सकते हैं, भले ही आपके पास असाइनमेंट न हो। इसके लिए एक उचित परमाणु आदिम का प्रयोग करें। यदि आपका कंपाइलर ऐसा एक्सटेंशन प्रदान नहीं करता है तो आप वेब पर उस के लिए आसानी से शॉर्ट इनलाइन असेंबलर पा सकते हैं। असेंबलर निर्देश हाथ पर परमाणु विनिमय के लिए ldrex
और strex
पर कॉल करते हैं, मुझे लगता है।
संपादित करें: ऐसा लगता है कि प्रश्न में पूछे जाने वाले विशिष्ट प्रोसेसर प्रकार इन निर्देशों को लागू नहीं करते हैं।
संपादित करें: निम्नलिखित जीसीसी के साथ काम करना चाहिए, एक और कंपाइलर के लिए शायद __asm__
भागों को अनुकूलित करना होगा।
inline
size_t arm_ldrex(size_t volatile*ptr) {
size_t ret;
__asm__ volatile ("ldrex %0,[%1]\[email protected] load exclusive\n"
: "=&r" (ret)
: "r" (ptr)
: "cc", "memory"
);
return ret;
}
inline
_Bool arm_strex(size_t volatile*ptr, size_t val) {
size_t error;
__asm__ volatile ("strex %0,%1,[%2]\[email protected] store exclusive\n"
: "=&r" (error)
: "r" (val), "r" (ptr)
: "cc", "memory"
);
return !error;
}
inline
size_t atomic_add_fetch(size_t volatile *object, size_t operand) {
for (;;) {
size_t oldval = arm_ldrex(object);
size_t newval = oldval + operand;
if (arm_strex(object, newval)) return newval;
}
}
स्रोत
2011-03-24 12:48:38
धन्यवाद unixsmurf। – JoeSlav
आप एकाधिक/एकल पैटर्न के लिए पुराने एआरएम पर 'swpb 'के साथ' swpb 'मिश्रण कर सकते हैं। आईई, ** एकाधिक ध्वज सेटर्स ** और ** एकल ध्वज स्पष्ट **। चार 'बाइट्स 'या ** राज्य ** तक उपलब्ध हैं। –