2012-02-20 25 views
7

En una clase, hemos tenido que usar semáforos para realizar trabajo con hilos. El prototipo (y archivo de cabecera) de sem_init es la siguiente:sem_init (...): ¿Para qué sirve el parámetro de valor?

int sem_init (sem_t * SEM, Int pshared, sin signo int value);

pero no entiendo para qué se usa la variable de valor. De acuerdo con opengroup.org:

valor es un valor inicial para establecer el semáforo para

"el valor es un valor ..." ¿Cómo ayuda eso, lo que es lo utiliza?

Respuesta

2

sem_init() inicializa un semáforo apuntado (primer parámetro), con valor (último parámetro), y finalmente creo que esto es realmente lo que estaba preguntando, int pshared se puede pensar como una bandera. Si pshared == 1, se puede bifurcar el semáforo.

EDITAR: el semáforo tiene valor int porque usaría una función como sem_wait (sem_t * sem) para disminuir apuntando al semáforo. Si es negativo, entonces bloquea.

+1

¿Qué significa "con un valor"?¿Significa que está bloqueado/desbloqueado? ¿Especifica el número de posibles adquisiciones del semáforo? – SomethingSomething

1

Con el fin de entender el "valor" en sem_init (sem_t * SEM, Int pshared, el valor entero sin signo)

Creo que tenemos que sincronizarla con la forma en que utilizamos el semáforo en códigos: cuando queremos para esperar al semáforo, llamamos a sem_wait (& mutex), y si queremos notificar para que se ejecuten otros hilos 'sem_wait (& mutex), necesitamos llamar a sem_post (& mutex). Pero el problema es que si ningún otro hilo llama a sem_post (& mutex) al principio (en la inicialización del sistema), ¿qué debería hacer el sem_wait (& mutex)? Debe pasar o esperar a que otros hilos invoquen sem_post (& mutex)? La respuesta está en el "valor" en sem_init(). Si es cero, significa que debemos esperar a que otros subprocesos invoquen sem_post() una vez, luego podría pasar. Si es uno, la primera vez que invoque sem_wait() pasará de inmediato, pero la segunda vez sem_wait() esperará (si no se llama sem_post durante ellos). Así que el valor en sem_init() significa cuántas veces podríamos ejecutar sem_wait() sin esperar realmente sin ningún sem_post(). Y podríamos considerar la sem_wait() como: /estancamiento de espera hasta que el valor se cambia a mayor que 0 por otro subproceso/

tiempo (valor < = 0) {}

value-- ;

y considerar la sem_post() como:

valor ++;

0

El valor de semáforo representa la cantidad de recursos comunes disponibles para compartir entre los subprocesos. Si el valor es mayor que 0, entonces el hilo que llama a sem_wait no necesita esperar. Simplemente disminuye el valor en 1 y procede a acceder al recurso común. sem_post agregará un recurso nuevamente al grupo. Entonces incrementa el valor en 1. Si el valor es 0, entonces esperaremos hasta que alguien haya hecho sem_post.