2010-01-23 15 views
5

पर परमाणु वृद्धि मैंने मैक ओएस एक्स पर परमाणु वृद्धि और कमी ऑपरेटर के लिए गुगल किया है और "OSAtomic.h" पाया है, लेकिन ऐसा लगता है कि आप इसे केवल कर्नेल स्पेस में उपयोग कर सकते हैं।मैक ओएस एक्स

Jeremy Friesner ने मुझे एक क्रॉस-प्लेटफार्म atomic counter पर इंगित किया जिसमें वे ओएस एक्स पर असेंबली या म्यूटेक्स का उपयोग करते हैं (जहां तक ​​मैं ifdefs के इंटरलिविंग को समझता हूं)।

क्या ओएस एक्स पर InterlockedDecrement या atomic_dec() जैसी कोई बात नहीं है?

उत्तर

7

आपको क्या लगता है कि OSAtomic केवल कर्नेल स्पेस है? निम्नलिखित संकलित और ठीक काम करता है।

#include <libkern/OSAtomic.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    int32_t foo = 1; 
    OSAtomicDecrement32(&foo); 
    printf("%d\n", foo); 

    return 0; 
} 
+0

गी, यह अजीब है! http://developer.apple.com/Mac/library/documentation/Darwin/Reference/KernelIOKitFramework/OSAtomic_h/index.html OSDecrementAtomic निर्दिष्ट करता है, लेकिन मुझे OSAtomicDecrement32 का कोई संदर्भ नहीं दिखता है, भले ही यह ठीक से संकलित हो। कर्नेल केवल एक मेलिंग सूची संग्रह पर पढ़ा गया था ... धन्यवाद पीएस: यदि आपको पता है कि दस्तावेज़ आपके कोड से अलग क्यों कहता है, तो मुझे जानकर खुशी होगी। – gaspard

+0

'libkern' भाग _ कर्नेल मोड_ का अर्थ नहीं है। उन्हें कर्नेल और ड्राइवर विकास ढांचे के हिस्से के रूप में पेश किया जाता है - विवरण के लिए देखें (http://developer.apple.com/mac/library/documentation/DriversKernelHardware/Reference/libkern_ref/index.html)। हो सकता है कि आप इसके बजाय 'OSAtomicDecrement32Barrier()' संस्करण का उपयोग करना चाहें। –

+0

@ डी। शॉली: मुझे मेमोरी बाधा की आवश्यकता नहीं है क्योंकि मैं स्मृति आवंटित नहीं कर रहा हूं (मैं एक समवर्ती संदर्भ गिनती कक्षा के लिए काउंटर का उपयोग करता हूं)। – gaspard

1

तुम भी CoreServices के माध्यम से IncrementAtomic() और DecrementAtomic() का उपयोग कर सकते हैं:

#include <CoreServices/CoreServices.h> 

int main(int argc, char** argv) 
{ 
    int val = 0; 
    IncrementAtomic(&val); 
    DecrementAtomic(&val);  

    return 0; 
} 

नोट: इन कार्यों में से वापसी मान, यह वृद्धि की जाती है से पहले पूर्णांक का मूल्य है, इसलिए अगर आप चाहते हैं Win32 InterlockedIncrement() और InterlockedDecrement() फ़ंक्शंस के समान व्यवहार, आपको रिटर्न मूल्य पर +1 वाले रैपर बनाने की आवश्यकता होगी।