Semáforo

Semáforo son una herramienta versátil en programación concurrente, proporcionando mecanismos efectivos para controlar el acceso a recursos compartidos y coordinar la ejecución de hilos, lo que contribuye a la escritura de programas concurrentes seguros y eficientes.
Aquí tienes un ejemplo simple de cómo se pueden utilizar semáforos en Python, utilizando la biblioteca threading
import threading
import time
# Crear un semáforo binario (inicializado en 1)
sem = threading.Semaphore(1)
# Variable compartida
contador = 0
# Función para incrementar el contador
def incrementar():
global contador
sem.acquire() # Operación wait
try:
for _ in range(1000000):
contador += 1
finally:
sem.release() # Operación signal
# Crear dos hilos que incrementan el contador
hilo1 = threading.Thread(target=incrementar)
hilo2 = threading.Thread(target=incrementar)
# Iniciar los hilos
hilo1.start()
hilo2.start()
# Esperar a que ambos hilos terminen
hilo1.join()
hilo2.join()
# Imprimir el valor final del contador
print("Valor final del contador:", contador)
En este ejemplo, se crea un semáforo binario (sem) con un valor inicial de 1. La función incrementar representa una sección crítica donde se incrementa la variable contador. Antes de entrar en la sección crítica, se adquiere el semáforo (sem.acquire()), y después de salir de la sección crítica, se libera el semáforo (sem.release()).
La operación acquire actúa como la operación wait, y release actúa como la operación signal. Estas operaciones aseguran que solo un hilo pueda ejecutar la sección crítica a la vez, logrando exclusión mutua y evitando condiciones de carrera.