2011-02-01 9 views
12

¿Hay operaciones entrelazadas (atómicas) en iOS SDK?¿Operaciones entrelazadas en iOS?

Necesito el incremento interlocked \ decrement y la comparsion entrelazada.

* ACTUALIZACIÓN: * Mi problema principal es esperar algunas NSThreads creadas por el hilo principal (el hilo principal no debe funcionar mientras que otros hilos funcionan).

No sé cómo hacerlo.

Respuesta

-2

Puede echar un vistazo a las propiedades (función ObjectiveC 2.0).

@property int atomicProperty;

hay de hecho ningún especificador 'atómica', como propiedades por defecto para atómica. Se pueden configurar como 'no atómicos'.

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

Puede que le interesen también por @synchronized. O esta parte del documento:

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

+0

¿Es self.someProperty == 12345 una operación atómica si alguna propiedad declarada como atómica? –

+0

Creo que ese es el propósito de la propiedad, sí. Agrega algunas salvaguardas contra accesos concurrentes. – jv42

-1

de Objective-C tiene la palabra clave sincronizada para operaciones atómicas.

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

Si especifica el atributo atómica en una declaración de propiedad, los setters y getters serán sythesized el uso de estos bloques sincronizados.

Consulte también el protocolo NSLock y NSLocking.

+4

La última vez que leí, @synchronized fue * no * una operación atómica; eran dos bloqueos mutex completos y manejo de excepciones. – justin

2

Actualización: El nivel del lenguaje atómico bajo C11 y C++ 11 ya está disponible.

Usted puede simplemente declarar _Atomic(int) a;.

A more detailed introduction.


operaciones atómicas y su documentación se puede encontrar en libkern/OSAtomic.h. una descripción general se puede encontrar bajo man atomic.

también, es probable que encuentre la compatibilidad con el lenguaje/biblioteca C11 y C++ 11 muy pronto.

+1

El soporte de C++ 11 ha estado allí por un tiempo, incluidas las operaciones atómicas. – marko

+0

@Marko gracias. la respuesta original ahora tiene 2 años de antigüedad, actualizada. – justin

+0

No creo que simplemente declarar con _Atomic() haga suficiente. También debe usar las funciones Atómicas, p. para incrementar un _Atomic int, use atomic_fetch_add (&i, 1); –