13
PROGRAMACIÓN MULTIHILO Y SINCRONIZACIÓN La programación multihilo es inherente en LabVIEW, basta con crear whiles’s en paralelo para tener procesos corriendo en paralelo, esto hace que muchas aplicaciones se puedan desarrollar de manera sencilla además de todas las ventajas que trae consigo el uso de LabVIEW. Los problemas de sincronización aparecen cuando dos o más hilos intentan compartir algo, ese algo puede ser simplemente información o un recurso (una variable, un fichero, etc). Existen mecanismos que ofrece LabVIEW para sincronizar tareas. Semáforos: Una de las herramientas de LabVIEW para sincronizar acciones, se llaman semáforos “Semaphore”. Con “Obtain Semaphore reference” inicializamos la herramienta. Los semáforos son un mecanismo para proteger el acceso a un determinado recurso copartido. El código usado para acceder al recurso compartido se llama sección crítica, el semáforo permite o deniega el acceso a una sección crítica. Con esta herramienta mandamos la orden a “Acquire Semaphore”, si uno de estos recibe la señal desde “Obtain Semaphore reference” el resto tendrán que esperar a que termine.

Capitulo3

Embed Size (px)

DESCRIPTION

labviwe

Citation preview

PROGRAMACIÓN MULTIHILO Y SINCRONIZACIÓN

La programación multihilo es inherente en LabVIEW, basta con crear whiles’s en paralelo para tener procesos corriendo en paralelo, esto hace que muchas aplicaciones se puedan desarrollar de manera sencilla además de todas las ventajas que trae consigo el uso de LabVIEW.

Los problemas de sincronización aparecen cuando dos o más hilos intentan compartir algo, ese algo puede ser simplemente información o un recurso (una variable, un fichero, etc). Existen mecanismos que ofrece LabVIEW para sincronizar tareas.

Semáforos:

Una de las herramientas de LabVIEW para sincronizar acciones, se llaman semáforos “Semaphore”.Con “Obtain Semaphore reference” inicializamos la herramienta.Los semáforos son un mecanismo para proteger el acceso a un determinado recurso copartido. El código usado para acceder al recurso compartido se llama sección crítica, el semáforo permite o deniega el acceso a una sección crítica.

Con esta herramienta mandamos la orden a “Acquire Semaphore”, si uno de estos recibe la señal desde “Obtain Semaphore reference” el resto tendrán que esperar a que termine.

Cuando la señal llega a “Release Semaphore” , otro “Acquire Semaphore” podrá comenzar.

Para cerrar la herramienta utilizamos “Release Semaphore Reference”.

El VI que vamos a utilizar para comprender el funcionamiento de esta herramienta es el siguiente:

El indicador estará continuamente oscilando entre +1000 y -1000, un semáforo se encargará de que llegue a +1000 y solo cuando haya completado este incremento comenzara a descender hasta -1000 con otro semáforo.Lo primero que haremos va a ser poner en 0 el indicador y poner en “False” el pulsador de STOP.

A continuación entramos en un “Flat Sequence” e iniciamos la herramienta de los semáforos.

En primer lugar se ejecutará el “While Loop” que está en la parte superior, dentro de este “While Loop” se cerrará el semáforo para entrar en un “Flat Sequence”.

En el interior del “Flat Sequence” tendremos otro “While Loop” encargado de incrementar nuestro indicador hasta 1000, utilizaremos una función “OR” para que se detenga en el momento que ha llegado a 1000 ó si pulsamos el botón de STOP.

Una vez salimos del “Flat Sequence” el semáforo queda abierto para que se pueda ejecutar otra acción regulada por esta herramienta.

Con el semáforo superior finalizado pasamos al de la parte inferior que es igual que el anterior con la única diferencia de que decrementa el indicador hasta llegar a -1000.

Cuando finaliza regresa al semáforo anterior.

OCCURRENCE

Las occurrences son un mecanismo para que un hilo o un VI pueda indicar a otro que ha ocurrido cierto suceso o evento. Se usan de forma parecida a los eventos, sirven para ejecutar un código cuando se da cierta condición, hasta que no sea cierta esa condición la tarea que contiene el código será congelada.La utilidad de esta herramienta es que podemos hacer que una parte no se ejecute hasta que no haya terminado otra.Para probar su funcionamiento vamos a hacer un pequeño programa con un LED.Colocamos un LED en el panel frontal.

Después vamos al diagrama de bloques y colocamos dos “While Loop” con un “Flat Sequence” doble en cada uno.

El fin de los “While Loop” lo ponemos con una constante “True”, de esta forma solo hará un ciclo y se detendrá.

Para trabajar de forma más ordenada, colocamos el indicador del LED a la izquierda y funcionamos con sus variables.

En el primer “Frame” de la secuencia del primer “While Loop” encendemos el LED y esperamos 3000ms con un “Wait (ms)”.

Ahora prepararemos la herramienta “Occurrence” que es la que nos interesa en este programa.

Digamos que el orden sería el siguiente:

La primera herramienta “Generate Occurrence” genera el acontecimiento, este acontecimiento llegará a la segunda “Set Ocurrence” y solo cuando haya llegado a esta segunda podrá realizarse la tercera “Wait on Occurrence”.

Tras esto se apagará el LED en el último “Frame”.

Renzevous

Con esta herramienta podemos hacer que distintos eventos se esperen entre sí.

La primera función que utilizamos es “Create Rendezvous”, con ella iniciaremos esta herramienta y configuraremos el nombre y el número de hilos que vamos a manejar.

La función que utilizaremos para esperar la sincronización es “Wait at Rendezvous”. En el momento que un hilo llegue desde “Create Rendezvous” hasta “Wait at Rendezvous” este esperará hasta que todos los “Wait a Rendezvous” hayan recibido el hilo.

Para comprender el funcionamiento de esta herramienta hemos hecho un pequeño .VI con tres indicadores LED y un control para el Rendezvous, así podremos ver la diferencia entre usarlo o no.

El panel frontal sería así.

El diagrama de bloques sería así.

A la izquierda coloco los controles e indicadores para tenerlo más ordenado.

Comienzo configurando la herramienta con “Create Rendezvous”, lo llamo RENDEZVOUS y lo configuro para 3 hilos.

Conecto cada hilo a tres “Flat Sequence”, cada uno de los cuales esta a su vez dividido en tres partes.

La primera orden es apagar los LED para que comiencen apagados desde el principio.

Seguidamente, para poder conectar o desconectar el rendezvous, introducimos la función “Wait at Rendezvous” en un “Case Structure” gobernado por el botón con enclavamiento que hemos puesto. Esto lo haremos en los tres “Flat Sequence”.

El siguiente cuadro del “Flat Sequence” será encender el LED correspondiente.

En el primer cuadro del segundo y el tercer “Flat Sequence” pondremos unos retardos de 1000ms y 4000ms respectivamente para establecer una diferencia de tiempo entre el encendido de cada LED y así probar el rendezvous.