2011-03-17 18 views
6

Estoy tratando de convertir código Java en código Objective C. Y el código java contiene variables definidas como volátiles. Miré en línea y el uso de "volátil" en Java como follwingObjetivo C: ¿Cuál es la mejor forma de convertir volátiles en Java en Objective C?

Essentially, volatile is used to indicate that a variable's value will be modified by different threads. 

lo tanto, si yo iba a establecer variables como volátil en Objective C porque las variables van a ser visitada por diferentes hilos entonces yo no necesito para establecer esas variables como volátiles porque puedo simplemente establecer esas variables como atómicas?

+0

Realmente no conozco el equivalente en Objective-C, pero puedo decir que "volátil" en Java no se trata de atomicidad: se trata de almacenar en caché. Una variable miembro volátil no se almacenará en caché en un registro, sino que se recuperará de la memoria cada vez que se necesite su valor. –

+2

Es extremadamente poco común que se necesite 'volátil' en Objective-C (más o menos solo para direccionamiento de hardware). Si cree que necesita volátiles, casi siempre es el caso que lo está haciendo mal. – bbum

Respuesta

18

La palabra clave volatile también existe en Objective-C. Puedes usarlo.

Esto se debe a Objective-C es un superconjunto de C.

declarar las propiedades como atomic no corregirá lo volatile estaba destinado a hacer. volatile efectivamente le dice al compilador que no optimice las comprobaciones realizadas en esa variable, porque puede haber cambiado cuando el compilador esperaba que no cambiara.

El ejemplo más simple es este. Digamos que tenemos declara una variable global como:

int packetsReceived = 0; 

Y se utilizó más adelante como esto:

packetsRecieved = 0; 

while (packetsRecieved < 10){ 
    //Wait for more packets 
} 

processPackets(); 

Nunca vamos a conseguir a través de ese bucle, porque el compilador dirá "Hey, packetsRecieved no se modifica en ese bucle, por lo tanto, se ejecutará infinitamente ". Como resultado, solo lo convertirá en un bucle infinito recto, por lo que puede evitar tener que verificarlo todo el tiempo.

Si en cambio se había declarado la variable como:

volatile int packetsRecieved; 

Le estamos diciendo al compilador que esta variable puede cambiar en cualquier momento, incluso cuando parece que debería permanecer igual. Por lo tanto, en nuestro ejemplo, el código máquina generado por el compilador seguirá controlando la condición y nuestro programa funcionará como se espera.

+1

¿Cómo pueden los paquetes recibidos ser modificados por otro hilo? Es solo una variable local. ¿Cómo accede otro subproceso? – JoJo

+0

Buen punto @JoJo. Actualizado. –

7

No, atomic y volatile no son lo mismo.

atomic (en una declaración de propiedad) significa que el getter/setter asegurará que se obtenga/configure un valor completo, independientemente de lo que otros hilos puedan estar haciendo simultáneamente.

volatile es un indicador para el compilador de que una variable puede modificarse por otros medios (otros subprocesos, dispositivos IO mapeados en memoria), por lo que no debería optimizar cargas (aparentemente) innecesarias de esa variable. Eso es similar a lo que significa en Java, aunque Java agrega algunas garantías sobre las barreras de memoria y el orden de las lecturas y escrituras que C (y Objective-C) no proporcionan. En particular, en C, simplemente declarar una variable volatile no es suficiente para usarla de manera segura desde múltiples hilos wikipedia:volatile variable.

0

Compartir objetos mutables entre diferentes hilos puede ser un gran dolor de cabeza y causar errores que son difíciles de rastrear. Objective-c tiene una gran preferencia por los objetos inmutables. Sugiero que, si es posible, encuentres una forma de pasar objetos inmutables si eso es posible. Entonces no tiene que preocuparse de que se escriba un objeto compartido.

Cuestiones relacionadas