2010-01-04 27 views
11

Threadsafe es un término que se presenta en torno a la documentación, sin embargo, rara vez se explica lo que significa, especialmente en un lenguaje que es comprensible para alguien que está aprendiendo a enhebrar por primera vez.¿Cómo se define threadsafe?

Entonces, ¿cómo se explica el código Threadsafe a alguien nuevo para enhebrar? Mis ideas para las opciones son el momento son:

  • ¿Utiliza una lista de lo que hace el código seguro para subprocesos vs hilo insegura
  • La definición libro
  • Una metáfora útil
+0

wiki de la comunidad? – Adrian

Respuesta

12

Eric Lippert says:

Cuando me preguntan "es el código de subprocesos?" Siempre tengo que retroceder y preguntar "¿Cuáles son los escenarios de subprocesamiento exactos que le preocupan?" y "¿Cuál es exactamente el comportamiento correcto del objeto en cada uno de esos escenarios?".

No es útil decir que el código es "thread safe" sin comunicar de alguna manera los comportamientos indeseables que los mecanismos de seguridad de hilos utilizados hacen y no previenen.

3

G'day,

Un buen lugar para comenzar es leer el POSIX paper on thread safety.

Editar: Solo los primeros párrafos le dan una visión general rápida de la seguridad de la rosca y el código de reentrada.

HTH

aplausos,

2

Un hilo seguro función/objeto (denominado en lo sucesivo como un objeto) es un objeto que está diseñado para soportar múltiples llamadas simultáneas. Esto se puede lograr mediante la serialización de solicitudes paralelas o algún tipo de soporte para llamadas entrelazadas.

Básicamente, si el objeto admite de manera segura solicitudes concurrentes (desde múltiples hilos), es seguro para subprocesos. Si no es seguro para subprocesos, varias llamadas simultáneas podrían dañar su estado.

Considere un libro de registro en un hotel. Si una persona está escribiendo en el libro y aparece otra persona que comienza a escribir simultáneamente su mensaje, el resultado final será una combinación de ambos mensajes. Esto también se puede demostrar mediante varios hilos que escriben en una secuencia de salida.

+0

Muy buen ejemplo –

0

El código de seguridad es un código que no fallará porque los mismos datos se cambiaron en dos lugares a la vez. Thread safe es un concepto más pequeño que concurrency-safe, ya que supone que, en realidad, se trataba de dos hilos del mismo programa, en lugar de (digamos) datos de modificación de hardware o del sistema operativo.

0

Un aspecto particularmente valioso del término es que se encuentra en un espectro de comportamiento concurrente, donde el hilo seguro es el más fuerte, la seguridad de interrupción es una restricción más débil que hilo seguro y reentrante aún más débil.

En el caso de seguridad de subprocesos, esto significa que el código en cuestión se ajusta a una API coherente y hace uso de recursos tales que otro código en un subproceso diferente (como otra instancia simultánea de sí mismo) no causará un incoherencia, siempre que también se ajuste al mismo patrón de uso. el patrón de uso DEBE especificarse para cualquier expectativa razonable de seguridad de hilo.

La restricción de interrupción segura no aparece normalmente en el código de usuario moderno, porque el sistema operativo hace un buen trabajo al ocultar esto, sin embargo, en modo kernel esto es muy importante. Esto significa que el código se completará con éxito, incluso si se desencadena una interrupción durante su ejecución.

El último, reentrante, está casi garantizado con todos los idiomas modernos, dentro y fuera del país de uso, y simplemente significa que una sección de código puede ingresarse más de una vez, incluso si la ejecución no ha precedido a la sección de código en casos más antiguos. Esto puede suceder en el caso de llamadas a funciones recursivas, por ejemplo. Es muy fácil violar la reentrada proporcionada por el idioma accediendo a una variable de estado global compartida en el código no reentrante.

+0

Hay dos cuestiones separadas implicadas: la primera, si una instancia anidada de una acción no debe iniciarse en ningún momento durante la ejecución de la primera, o si puede ocurrir en puntos específicos permitidos, o en puntos esencialmente arbitrarios ; el segundo es si una acción anidada debe completarse antes de que la acción original pueda reanudarse. Debido a que la multitarea es tan popular, la mayoría de las rutinas que pueden iniciar una acción anidada le permitirán ejecutarla simultáneamente con la primera, pero solía ser (y en algunos contextos incrustados aún lo es) común para que una acción anidada guarde el contexto de el primero ... – supercat

+0

... cuando entra, y restaurarlo en la salida. En los escenarios que hacen uso del estado global, este patrón puede ser mucho más fácil de trabajar que teniendo múltiples estados activos y la capacidad de cambiar entre ellos. Sin embargo, sí impone algunas restricciones sobre los tipos de tareas múltiples que uno puede hacer. – supercat

14

El subprocesamiento múltiple conduce a la ejecución no determinista: no se sabe exactamente cuándo se ejecuta un determinado código paralelo.

Teniendo en cuenta que, esta maravillosa multithreading tutorial define la seguridad hilo de la siguiente manera:

código Hilo de seguridad es un código que no tiene la indeterminación en la cara de cualquier escenario de múltiples hilos. La seguridad de subprocesos se logra principalmente con bloqueo, y al reducir las posibilidades de interacción entre subprocesos.

Esto significa que no importa cómo los hilos se ejecutan en particular, el comportamiento es siempre bien definidos (y por lo tanto libre de race conditions).

3

Quizás sea incorrecto, pero uno de los criterios para ser seguro para subprocesos es usar solo variables locales. El uso de variables globales puede tener un resultado indefinido si se llama a la misma función desde diferentes subprocesos.

+0

solo parcialmente, ya que simplemente tiene que proteger esas variables globales con mutexes, por ejemplo, para tener una función de seguridad de subprocesos – claf

+0

@claferri: Creo que la intención de hacer la pregunta era saber cuáles son las cosas que podrían llevar a un hilo inseguro.Definitivamente puede usar objetos de sincronización (no solo mutex sino semáforos/secciones críticas, etc.) para hacer que las secuencias sean seguras. Quería señalar una de las cosas que conduce al código inseguro de subprocesos. El voto abajo fue innecesario. –