Sincronización de subprocesos

Actualización: noviembre 2007

Cuando se crea una aplicación multiproceso, se deben sincronizar los subprocesos individuales con otras partes del programa. La sincronización ofrece un compromiso entre la naturaleza desestructurada de la programación multiproceso y el orden estructurado del procesamiento sincrónico.

Las técnicas de sincronización se utilizan:

  • Para controlar explícitamente el orden en que se ejecuta el código, siempre que sea necesario ejecutar tareas en una secuencia específica

    O bien

  • Para evitar los problemas que pueden producirse cuando dos subprocesos comparten los mismos recursos al mismo tiempo.

Por ejemplo, puede utilizar la sincronización para hacer que un procedimiento de presentación espere hasta que se complete un procedimiento de recuperación de datos que se está ejecutando en otro subproceso.

Técnicas de sincronización

Hay dos enfoques para la sincronización, el sondeo y el uso de objetos de sincronización. Vea Técnicas de sincronización avanzadas para obtener más información sobre los objetos de sincronización.

Sondeo

El sondeo comprueba repetidamente el estado de una llamada asincrónica desde el interior de un bucle. El sondeo es el modo menos eficiente para administrar subprocesos, porque desperdicia recursos al comprobar repetidamente el estado de las diversas propiedades del subproceso.

Por ejemplo, es posible utilizar la propiedad IsAlive durante el sondeo para ver si se ha salido de un subproceso. Utilice esta propiedad con cuidado, porque un subproceso activo puede no estar necesariamente en ejecución.

Se puede utilizar la propiedad ThreadState del subproceso para obtener información más detallada sobre su estado. Ya que los subprocesos pueden estar en más de un estado en un momento determinado, el valor almacenado en ThreadState puede ser una combinación de los valores de la enumeración System.Threading.ThreadState. En consecuencia, es recomendable comprobar minuciosamente todos los estados relevantes del subproceso al utilizar el sondeo. Por ejemplo, si el estado de un subproceso indica un valor distinto de Running, es posible que haya terminado. Por otra parte, puede estar suspendido o inactivo.

Esperar la finalización de un subproceso

El método Thread.Join es útil para determinar si un subproceso ha finalizado antes de iniciarse otra tarea. El método Join espera durante un tiempo determinado a que finalice un subproceso. Si el subproceso finaliza antes del tiempo de espera, Join devuelve True; de lo contrario devuelve False.

Como puede imaginar, el sondeo sacrifica muchas de las ventajas del multiproceso en favor de un mayor control sobre el orden en que se ejecutan los subprocesos. Debido a su ineficacia, el sondeo no suele ser recomendable. Un enfoque más eficaz utilizaría el método Join para controlar los subprocesos. Join determina que un procedimiento que realiza una llamada espere hasta que finalice un subproceso o hasta que finalice el tiempo de espera de la llamada, si se especifica un tiempo de espera. El nombre "join" (unir) se basa en la idea de que la creación de un nuevo subproceso es una bifurcación en la ruta de ejecución. Join se utiliza para combinar de nuevo rutas de ejecución separadas en un solo subproceso.

Subprocesos Join y Set

Figura 1 Subprocesos

Un punto debe quedar claro: Join es una llamada sincrónica o de bloqueo. Cuando se llama a Join o a un método de espera de un controlador de espera, el procedimiento de llamada se detiene y espera a que el subproceso indique su finalización.

Sub JoinThreads()
    Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)
    Thread1.Start()
    Thread1.Join()      ' Wait for the thread to finish.
    MsgBox("Thread is done")
End Sub
Sub SomeTask()
    ' Insert code to perform a task here.
End Sub

Estos sencillos métodos de control de subprocesos, que resultan útiles al administrar un número pequeño de subprocesos, son difíciles de utilizar con proyectos grandes. En Técnicas de sincronización avanzadas se tratan algunas técnicas que pueden utilizarse para sincronizar subprocesos.

Vea también

Conceptos

Subprocesamiento múltiple avanzado con Visual Basic

Parámetros y valores devueltos para procedimientos multiproceso

Otros recursos

Subprocesamiento múltiple en Visual Basic