¿Cuál es el significado del término "seguro para subprocesos"?

Resuelto Varun Mahajan asked hace 15 años • 0 respuestas

¿Significa que dos subprocesos no pueden cambiar los datos subyacentes simultáneamente? ¿O significa que el segmento de código dado se ejecutará con resultados predecibles cuando varios subprocesos ejecuten ese segmento de código?

Varun Mahajan avatar Nov 04 '08 19:11 Varun Mahajan
Aceptado

El código seguro para subprocesos es código que funcionará incluso si muchos subprocesos lo ejecutan simultáneamente.

http://mindprod.com/jgloss/threadsafe.html

Marek Blotny avatar Nov 04 '2008 12:11 Marek Blotny

Una pregunta más informativa es qué hace que el código no sea seguro para subprocesos, y la respuesta es que hay cuatro condiciones que deben cumplirse... Imagine el siguiente código (y su traducción en lenguaje automático)

totalRequests = totalRequests + 1
MOV EAX, [totalRequests]   // load memory for tot Requests into register
INC EAX                    // update register
MOV [totalRequests], EAX   // store updated value back to memory
  1. La primera condición es que haya ubicaciones de memoria a las que se pueda acceder desde más de un subproceso. Normalmente, estas ubicaciones son variables globales/estáticas o memoria de montón accesible desde variables globales/estáticas. Cada subproceso obtiene su propio marco de pila para variables locales con alcance de función/método, por lo que estas variables de función/método local, otoh, (que están en la pila) son accesibles solo desde el subproceso propietario de esa pila.
  2. La segunda condición es que haya una propiedad (a menudo llamada invariante ), asociada con estas ubicaciones de memoria compartida, que debe ser verdadera o válida para que el programa funcione correctamente. En el ejemplo anterior, la propiedad es que " totalRequests debe representar con precisión el número total de veces que cualquier subproceso ha ejecutado cualquier parte de la declaración de incremento ". Normalmente, esta propiedad invariante debe ser verdadera (en este caso, totalRequests debe contener un recuento preciso) antes de que se produzca una actualización para que sea correcta.
  3. La tercera condición es que la propiedad invariante NO se mantenga durante alguna parte de la actualización real. (Es transitoriamente inválido o falso durante alguna parte del procesamiento). En este caso particular, desde el momento en que se recupera totalRequests hasta el momento en que se almacena el valor actualizado, totalRequests no satisface el invariante.
  4. La cuarta y última condición que debe ocurrir para que ocurra una carrera (y para que el código NO sea "seguro para subprocesos") es que otro subproceso debe poder acceder a la memoria compartida mientras el invariante está roto, causando así inconsistencia o comportamiento incorrecto.
Charles Bretana avatar Nov 04 '2008 16:11 Charles Bretana