इंटेल मैकोज़क्स पर, आप अंतर्निहित सिस्टम परमाणु संचालन का उपयोग कर सकते हैं। 32 या 64 बिट पूर्णांक के लिए एक परमाणु प्राप्त या सेट नहीं किया गया है, लेकिन आप इसे प्रदान की गई तुलना एंडस्पेप से बना सकते हैं। आप विभिन्न ओएसएटॉमिक कार्यों के लिए एक्सकोड दस्तावेज खोजना चाह सकते हैं। मैंने नीचे 64-बिट संस्करण लिखा है। 32-बिट संस्करण समान नामित कार्यों के साथ किया जा सकता है।
#include <libkern/OSAtomic.h>
// bool OSAtomicCompareAndSwap64Barrier(int64_t oldValue, int64_t newValue, int64_t *theValue);
void AtomicSet(uint64_t *target, uint64_t new_value)
{
while (true)
{
uint64_t old_value = *target;
if (OSAtomicCompareAndSwap64Barrier(old_value, new_value, target)) return;
}
}
uint64_t AtomicGet(uint64_t *target)
{
while (true)
{
int64 value = *target;
if (OSAtomicCompareAndSwap64Barrier(value, value, target)) return value;
}
}
ध्यान दें कि एप्पल के OSAtomicCompareAndSwap कार्यों atomically कार्रवाई करने:
हम उदाहरण में इस का उपयोग ऊपर पहले वर्ष मूल्य हथियाने के द्वारा एक सेट विधि बनाने के लिए है, तो स्वैप करने के लिए प्रयास करने से लक्ष्य स्मृति के मूल्य। यदि स्वैप सफल होता है, तो यह इंगित करता है कि स्वैप के समय स्मृति का मान अभी भी पुराना मान है, और इसे स्वैप (जो स्वयं परमाणु है) के दौरान नया मान दिया जाता है, इसलिए हम कर रहे हैं। यदि यह सफल नहीं होता है, तो कुछ अन्य धागे ने उस मूल्य को संशोधित करके हस्तक्षेप किया है जब हमने इसे पकड़ लिया था और जब हमने इसे रीसेट करने का प्रयास किया था। यदि ऐसा होता है, तो हम केवल लूप कर सकते हैं और केवल न्यूनतम जुर्माना के साथ पुनः प्रयास कर सकते हैं।
गेट विधि के पीछे विचार यह है कि हम पहले मूल्य को पकड़ सकते हैं (जो वास्तविक मान हो सकता है या नहीं, यदि कोई अन्य धागा हस्तक्षेप कर रहा हो)। इसके बाद हम मूल्य को स्वैप करने का प्रयास कर सकते हैं, यह जांचने के लिए कि प्रारंभिक हड़पने परमाणु मूल्य के बराबर था।
मैंने अपने कंपाइलर के खिलाफ यह जांच नहीं की है, इसलिए कृपया किसी भी टाइपो से क्षमा करें।
आपने विशेष रूप से ओएसएक्स का उल्लेख किया है, लेकिन यदि आपको अन्य प्लेटफ़ॉर्म पर काम करने की आवश्यकता है, तो विंडोज़ में कई इंटरलॉक * फ़ंक्शंस हैं, और आप उनके लिए एमएसडीएन दस्तावेज़ खोज सकते हैं। उनमें से कुछ विंडोज 2000 प्रो और बाद में काम करते हैं, और कुछ (विशेष रूप से 64-बिट कार्यों में से कुछ) Vista के साथ नए हैं। अन्य प्लेटफार्मों पर, जीसीसी संस्करण 4.1 और बाद में __sync_fetch_and_add() जैसे विभिन्न प्रकार के __sync * फ़ंक्शन हैं। अन्य प्रणालियों के लिए, आपको असेंबली का उपयोग करने की आवश्यकता हो सकती है, और आप एसईवीएन ब्राउजर में एसआईवीएनओएस प्रोजेक्ट के लिए कुछ कार्यान्वयन, src/system/libroot/os/arch के अंदर पा सकते हैं।
आप जीसीसी इंट्रिनिक्स का उपयोग करने का सुझाव देते हैं, फिर कंपाइलर पर भरोसा न करें। क्या आप इंट्रिनिक्स के अलावा किसी अन्य चीज का जिक्र कर रहे हैं जिसे संकलक पर भरोसा नहीं किया जाना चाहिए? – Jeff