AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Ayuda / WLanguage / Funciones WLanguage / Funciones estándar / Funciones de gestión de procesos / Hilos, semáforos, señales y mutex
  • Presentación
  • Principio
  • ¿Cómo implementar un semáforo?
  • Etapas:
  • Observaciones
  • Funciones de gestión de semáforos
  • Ejemplo
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Presentación
Los semáforos limitan la ejecución simultánea de un código (procedimiento, línea de código, etc.) a uno o más subprocesos en un momento dado. Un semáforo se puede compartir entre varias aplicaciones.
Por ejemplo: Dos subprocesos específicos se utilizan en una aplicación bancaria:
  • un subproceso para depositar fondos en una cuenta
  • un subproceso para retirar fondos de una cuenta.
En un momento dado, solo puede haber un depósito o retiro.
Observación: Existen otros sistemas que permiten proteger una sección de código:
  • Las exclusiones mutuas (Mutex) limitan la ejecución simultánea de un código (procedimiento, línea de código, etc.) a un solo subproceso en un momento dado. Un Mutex se puede compartir entre varias aplicaciones. Para obtener más información, consulte Gestionar la exclusión mutua en subprocesos.
  • Las secciones críticas limitan la ejecución simultánea de un código (procedimiento, línea de código, etc.) a un subproceso en un momento dado en una sola aplicación. Para obtener más información, consulte Gestionar secciones críticas.
Principio
El semáforo se crea con la función SemaphoreCreate.
  1. El subproceso n°1 ejecuta la función SemaphoreStart: no hay ningún subproceso en el semáforo.
  2. El subproceso n°1 ejecuta la sección de código protegida por el semáforo.
  3. Mientras que el subproceso n°1 ejecuta el código protegido por el semáforo, el subproceso n°2 ejecuta la función SemaphoreStart: dado que el hilo n°1 está ejecutando el código protegido por el semáforo, el hilo n°2 debe esperar a que se libere el semáforo.
  4. El subproceso n°1 ejecuta la función SemaphoreEnd: ningún subproceso ejecuta el código del semáforo.
  5. El subproceso n°2 puede ejecutar el código protegido por el semáforo.
  6. El subproceso n°2 ejecuta la función SemaphoreEnd: ningún subproceso ejecuta el código del semáforo.
¿Cómo implementar un semáforo?

Etapas:

Las etapas para implementar un semáforo son las siguientes:
  1. Crear un semáforo con la función SemaphoreCreate. El semáforo se asocia a un nombre.
  2. Llamar a la función SemaphoreStart antes de la sección de código que se va a proteger.
  3. Llamar a la función SemaphoreEnd para delimitar la sección de código que se va a proteger. Las líneas de código que se encuentran después de SemaphoreEnd no se protegerán.
  4. Destruir el semáforo con la función SemaphoreDestroy.

Observaciones

  • Las secciones de código protegidas por un semáforo deben ser lo más cortas posible y tratar solo los procesos "críticos".
  • Se puede utilizar un semáforo con el mismo nombre para proteger varias secciones de código. Solo un subproceso puede estar en una de las áreas protegidas por el semáforo en un momento dado.
  • Cuando hay un subproceso en espera, no se utilizan los recursos del procesador.
  • Los semáforos se utilizan tanto en el subproceso principal con en los secundarios (creados con la función ThreadExecute). Se debe evitar bloquear el subproceso principal. Si se bloquea el subproceso principal (en espera), no se puede ejecutar la aplicación.
  • Las funciones SemaphoreStart y SemaphoreEnd deben utilizarse en el mismo proceso (en un procedimiento, por ejemplo).
  • Los semáforos se pueden compartir o no entre las diferentes aplicaciones que se ejecutan en el equipo. Al crear los semáforos, especifique cómo se compartirán (función SemaphoreCreate).

Funciones de gestión de semáforos

Las siguientes funciones WLanguage permiten gestionar los semáforos:
SemaphoreCreateCrea un semáforo.
SemaphoreDestroyDestruye explícitamente un semáforo.
SemaphoreEndPermite a uno o más hilos salir del área protected por el semáforo.
SemaphoreStartBloquea el hilo actual hasta que se abra el semáforo (es decir, hasta que haya un punto "libre" disponible en la sección protected).

Ejemplo

Para hacer una asignación compartida entre varios subprocesos, se debe encapsular en un semáforo la asignación de las variables y la lectura de estas mismas.
Versión mínima requerida
  • Versión 9
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 21/06/2023

Señalar un error o enviar una sugerencia | Ayuda local