2011-05-18 5 views
5

Como se dijo varias veces antes aquí, puede spwan un hilo nuevo (poniendo un cómputo de procesamiento largo en actor{} bloque) dentro de un actor, y el cálculo generado se ejecutará con seguridad en el mismo grupo de subprocesos (utilizado por el planificador actor)¿Está generando un nuevo actor a partir de uno existente seguro para subprocesos?

actor{ 
    var i = 0 
    case msg => actor { 
     // computation 
     i = i + 1 // is `i` still thread safe? 
        // looks like it can be access simultaneosly from 2 two threads now 
        // should I make it @volatile? 
    } 
    reply(i) 
} 

Sin embargo, ¿será seguro para subprocesos, y lo hace seguir, en general, el diseño original, que establece que sólo un hilo en un momento de tiempo se puede trabajar con un actor?

Respuesta

8

Engendrar a un actor de otra persona es completamente seguro.

Sin embargo, compartir el estado mutable entre actores no lo es, independientemente de cómo se generaron &.

El objetivo de los actores es que deben comunicarse con los mensajes, a través de sus buzones de correo. Abusar de este modelo y los actores no ofrecen más protección frente a problemas de concurrencia de lo que se obtiene con los hilos crudos.

1

En su ejemplo, i se puede acceder desde múltiples hilos; que haciendo el cálculo y la respuesta de llamada hilo. Tal vez deberías responder con un Future?

reply(future { /* perform computation */ }) 

La persona que llama sería entonces capaz de reaccionar al canal de entrada de futuros (no bloqueante), o simplemente apply() (bloqueo).

0

Los actores solo pueden procesar un mensaje de forma simultánea, por lo que todo lo que está haciendo dentro de su actor es seguro en cuanto a los hilos, nunca debe pensar en la seguridad de los hilos.

Esta es la idea completa detrás de los actores y su diseño de concurrencia.

Cuestiones relacionadas