versión 11 (Modificado)
Semaphore (semaforo{; ticCont}) Booleano
Parámetro | Tipo | Descripción | |
semaforo | Alfa | Semáforo a probar y colocar | |
ticCont | Entero | Máximo tiempo de espera | |
Resultado | Booleano | El semáforo se ha creado correctamente (FALSE) o | |
El semáforo ya había sido creado (TRUE) |
Descripción
Un semáforo es una bandera compartida entre estaciones de trabajo (el ordenador de cada usuario) o entre procesos en la misma estación de trabajo. Un semáforo simplemente existe o no existe. Los métodos que cada usuario ejecuta pueden probar la existencia de un semáforo. Creando y probando semáforos, los métodos pueden comunicarse entre estaciones de trabajo.
La función Semaphore devuelve TRUE si semaforo existe. Si no existe semaforo, Semaphore lo crea y devuelve FALSE. Sólo un usuario al tiempo puede crear un semáforo. Si semaforo devuelve FALSE, esto significa que el semáforo no existe, pero también significa el semáforo ha sido creado para el proceso en el cual la llamada se ha efectuado.
Semaphore devuelve FALSE si el semáforo no fue definido. También devuelve FALSE si el semáforo ya fue definido por el mismo proceso en el cual el la llamada ha sido efectuada. semaforo está limitado a 255 caracteres, incluyendo prefijos (<>, $). Si usted pasa una cadena más larga, el semáforo se truncará.
El parámetro opcional ticCont le permite especificar un tiempo de espera (en tics) si semaforo ya está definido. En este caso, la función esperará o que el semáforo sea liberado o el tiempo de espera para terminar antes de devolver True.
Hay dos tipos de semáforos en 4D: semáforos locales y semáforos globales.
Un semáforo local es visible para todos los procesos de una misma estación de trabajo y solamente en la estación de trabajo. Un semáforo local puede ser creado colocando al nombre del semáforo el signo dólar ($) como prefijo. Los semáforos locales se utilizan para monitorear operaciones entre los diferentes procesos ejecutados en la misma estación de trabajo. Por ejemplo, un semáforo local puede ser utilizado para monitorea el acceso a un array interproceso compartido por todos los procesos en una base mono usuario o en la estación de trabajo.
Un semáforo global es visible para todos los usuarios y todos sus procesos. Usted utiliza semáforos globales para monitorear operaciones entre usuarios de una base multiusuario.
Los semáforos globales y locales son idénticos en su lógica. La diferencia reside en su alcance.
En 4D Server, los semáforos globales se comparten entre todos los procesos ejecutados de todos los clientes. Un semáforo local sólo se comparte entre los procesos ejecutados en el equipo cliente donde ha sido creado.
En 4D , los semáforos globales y locales tienen el mismo alcance porque usted es el único usuario. Sin embargo, si su base está siendo utilizada en los dos entornos, asegúrese de utilizar semáforos globales y locales dependiendo de lo que quiera hacer.
Usted no utiliza semáforos para proteger el acceso a los registros. Esta gestión es efectuada automáticamente por 4D y 4D Server. Utilice semáforos para evitar que varios usuarios realicen la misma operación al mismo tiempo.
Ejemplos
1. En este ejemplo, usted quiere evitar que dos usuarios efectúen simultáneamente una actualización global de los precios en una tabla Productos. El siguiente método utiliza semáforos para hacer esto:
If (Semaphore("ActualizacionPrecios")) ` Trate de crear el semáforo ALERT("Otro usuario ya está actualizando los precios. Inténtelo más tarde.") Else ActualizarPrecios ` Actualización de todos los precios CLEAR SEMAPHORE("ActualizacionPrecios") ` Borrar el semáforo End if
2. El siguiente ejemplo utiliza un semáforo local. En una base con varios procesos, usted quiere mantener una lista de "Cosas por hacer". Usted quiere mantener la lista en un array interproceso y no en una tabla. Usted utiliza un semáforo para evitar el acceso simultáneo. En esta situación, sólo necesita utilizar un semáforo local, porque su lista "Cosas por hacer" es sólo para su uso personal.
El array interproceso se inicializa en el método Startup:
ARRAY TEXT(<>ListaHacer;0) ` La lista de cosas por hacer está inicialmente vacía
Este es el método utilizado para añadir elementos a la lista de cosas por hacer:
` Método de proyecto AGREGAR A LISTA DE COSAS POR HACER ` AGREGAR A LISTA DE COSAS POR HACER ( Texto ) ` AGREGAR A LISTA DE COSAS POR HACER ( Elemento de la lista de cosas por hacer) C_TEXT($1) If(Not(Semaphore("$AccesoLista";300))) ` Espera 5 segundos si el semáforo ya existe $vlElem:=Size of array(<>ListaHacer)+1 INSERT IN ARRAY(<>ListaHacer;$vlElem) <>ListaHacer{$vlElem}:=$1 CLEAR SEMAPHORE("$AccesoLista") ` Borrar el semáforo End if
Puede llamar este método desde cualquier proceso.
Ver también
CLEAR SEMAPHORE, Test semaphore.