2009-07-23 12 views
7
class StopIt 
{ 
    private bool stop; 

    void Loop() 
    { 
    while (!stop) 
    { 
     // work 
    } 
    } 

    void Stop() 
    { 
    stop = true; 
    } 
} 

Básicamente, si el método Loop se ejecuta en un subproceso y se llama a Stop desde otro, ¿la operación se detendrá correctamente? Entiendo que bool read/write es atómico. Pero, ¿es esto suficiente? Si el bucle de hilo no se detiene inmediatamente, hay un problema. ¿Debo marcar stop volátil?Es una operación atómica suficiente

+0

Mi regla: si no sabe EXACTAMENTE qué significa volátil, no debería intentar escribir programas sin candado. Ya que haces la pregunta, no sabes lo que significa. Por lo tanto, no intente escribir un programa sin candado. Cuidate. Usa un candado Las cerraduras son solo costosas cuando se disputan; no intente hacerlo sin bloqueo hasta que esté seguro de que (1) tiene un problema de rendimiento (2) el bloqueo es la causa del problema y (3) entiende qué significa volátil hasta el nivel de hardware del procesador. –

+0

¿No debería usar el bloqueo cuando se accede a la detención? Si es así, ¿cómo bloqueo el acceso de lectura en el ciclo while? –

+1

@yummy: es difícil fijar la lectura como se ve ahora, ya que accede al campo directamente en su ciclo while. Si encapsula esa lectura en una propiedad (o un método), puede usar un candado para leer el valor. –

Respuesta

10

Sí, definitivamente debe marcar stop como volátil.

La atomicidad no es suficiente, no garantiza que un hilo pueda "ver" los cambios realizados por otro.

Mientras mi comprensión de volatile está experimentando actualmente una cirugía, puede más o menos pensar en una escritura a una variable volátil como "asegurarse de que otros puedan ver esto inmediatamente!" y una lectura de una variable volátil como "¡Quiero ver el último valor!"

Sin hacer stop volátil, ese bucle podría continuar indefinidamente, incluso si se llama a Stop() en un hilo diferente. Básicamente, el JIT podría leer razonablemente la variable en un registro y luego simplemente leer desde el registro para siempre.

De hecho, si el "trabajo" siempre implica llamar a un método no-inline, creo que el JIT está obligado actualmente a hacer una lectura volátil de todos modos, pero eso es sólo una limitación práctica actual ... la teoría dice que debería hacerlo volátil.

+0

¿Cómo puede un hilo acceder a lo que sucede en otro? – KdgDev

+0

Lo contrario también es cierto: ¡volátil no es suficiente para la atomicidad! – Noldorin

+0

@Noldorin: irrelevante en este caso, ya que la escritura en el booleano * será * atómica en función de la sección 12.6.6 de la partición 1. de ECMA 335 –

Cuestiones relacionadas