7.5.4 Objetos Semaphore (semáforo)

Ésta es una de las más antiguas primitivas de sincronización de la historia de la ciencia informática. Fue inventada por el informático teórico holandés Edsger W. Dijkstra (él utilizaba P() y V() en lugar de acquire() y release()).

Un semáforo gestiona un contador interno que se decrementa en cada llamada a acquire() y se incrementa en cada llamada a release(). El contador nunca puede bajar de cero. Si una llamada a acquire() se encuentra el contador a cero, bloquea la ejecución del hilo en curso y queda a la espera de que otro hilo llame a release().

Semaphore ([value])
El argumento opcional proporciona el valor inicial del contador interno. El valor predeterminado es 1.

acquire ([blocking])
Adquirir un semáforo.

Si se invoca sin argumentos: si el contador interno es superior a cero a la entrada, lo decrementa en una unidad y retorna de inmediato. Si es cero a la entrada, bloquear la ejecución del hilo, esperando a que otro llame a release() para hacerlo mayor de cero. Se gestionan de manera adecuada los interbloqueos, por lo que si hay varias llamadas a acquire() bloqueadas a la espera, release() despertará exactamente a una de ellas. La implementación puede seleccionar una al azar, por lo que no se debe confiar en un orden de respuesta observado. No hay valor de retorno en este caso.

Si se invoca con el argumento blocking a verdadero, hacer lo mismo que si se llama sin argumentos y devolver verdadero.

Si se invoca con blocking a falso, no bloquear. Si una llamada sin argumentos bloquearía, devolver falso de inmediato. En caso contrario, hacer lo mismo que si se llama sin argumentos y devolver verdadero.

release ()
Liberar un semáforo, incrementando su contador interno en una unidad. Si era cero a la entrada y otro hilo está esperando a que sea mayor que cero, despertar a dicho hilo.


Ver Sobre este documento... para obtener información sobre sugerencias.