2011-02-01 8 views
12

क्या आईओएस एसडीके में इंटरलॉक (परमाणु) संचालन हैं?आईओएस में इंटरलाक्ड ऑपरेशंस?

मुझे अंतःस्थापित वृद्धि \ कमी और अंतःस्थापित संपीड़न की आवश्यकता है।

* अद्यतन: * मेरी मुख्य समस्या मुख्य धागे द्वारा बनाए गए कुछ एनएसटीएचड के लिए प्रतीक्षा कर रही है (मुख्य धागे अन्य थ्रेड काम करते समय काम नहीं करना चाहिए)।

मुझे नहीं पता कि यह कैसे करें।

उत्तर

16

आप Using Atomic Operations में वर्णित OSAtomicIncrement*/OSAtomicDecrement* संचालन का उपयोग कर सकते हैं।

-2

आप गुणों (ऑब्जेक्टिव सी 2.0 फीचर) पर एक नज़र डाल सकते हैं।

@property int atomicProperty;

वहाँ गुण डिफ़ॉल्ट के रूप में परमाणु करने के लिए, कोई 'परमाणु' विनिर्देशक वास्तव में है। उन्हें 'nonatomic' पर सेट किया जा सकता है।

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

आप @synchronized भी द्वारा रुचि हो सकती है। या दस्तावेज़ के इस हिस्से:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

+0

क्या self.someProperty == 12345 परमाणु ऑपरेशन है अगर कुछ प्रॉपर्टी परमाणु के रूप में घोषित किया गया है? –

+0

मुझे लगता है कि यह संपत्ति का उद्देश्य हां है। यह समवर्ती अभिगम के खिलाफ कुछ सुरक्षा उपाय जोड़ता है। – jv42

-1

ऑब्जेक्टिव-सी कीवर्ड परमाणु संचालन के लिए सिंक्रनाइज़ है।

@synchronized(object) { 
    // ... 
} 

आप एक संपत्ति घोषणा में विशेषता परमाणु निर्दिष्ट करते हैं, setters और getters इन सिंक्रनाइज़-ब्लॉक का उपयोग sythesized कर दिया जाएगा।

NSLock और NSLocking प्रोटोकॉल को भी देखें।

+4

आखिरकार मैंने पढ़ा, @ सिंक्रनाइज़ * * परमाणु सेशन नहीं था; यह दो पूर्ण उड़ा हुआ म्यूटेक्स ताले और अपवाद हैंडलिंग था। – justin

2

अद्यतन: सी 11 और सी ++ 11 के तहत भाषा स्तर परमाणु अब उपलब्ध हैं।

आप बस _Atomic(int) a; घोषित कर सकते हैं।

A more detailed introduction


परमाणु संचालन और उनके दस्तावेज़ libkern/OSAtomic.h में पाए जा सकते हैं। एक सिंहावलोकन man atomic के तहत पाया जा सकता है।

साथ ही, आपको जल्द ही सी 11 और सी ++ 11 भाषा/लाइब्रेरी समर्थन मिल जाएगा।

+1

सी ++ 11 समर्थन थोड़ी देर के लिए परमाणु संचालन सहित रहा है। – marko

+0

@ मार्को धन्यवाद। मूल उत्तर अब 2 साल पुराना है - अद्यतन। – justin

+0

मुझे नहीं लगता कि बस _Atomic() के साथ घोषित करना पर्याप्त है। आपको परमाणु कार्यों का भी उपयोग करना होगा, उदा। _Atomic int बढ़ाने के लिए, atomic_fetch_add का उपयोग करें (&i, 1); –

संबंधित मुद्दे