2012-04-18 11 views
5

Así que si yo he puesto un semáforo semid con num_of_sems semáforos y una sembuf*deleter_searchers_downSemop: ¿Al disminuir un conjunto de semáforos se disminuyen todos a la vez o se bloquea en la primera falla?

struct sembuf *deleter_searchers_down 
         = malloc(sizeof (*deleter_searchers_down) * num_of_sems); 
for (i = 0; i < num_of_sems; ++i) { 
      (deleter_searchers_down + i)->sem_op = -1; 
      (deleter_searchers_down + i)->sem_num = i; 
      (deleter_searchers_down + i)->sem_flg = SEM_UNDO; 
     } 
semop(semid, deleter_searchers_down, num_of_sems); 

La llamada a la llamada al sistema intentará bajar todos los semáforos en el conjunto de una sola vez o va a bloquear una vez que se intenta para bajar el primer semáforo que es 0 y continuar después de algunos otros procesos de ese semáforo en particular?

+0

Los semáforos hacen exactamente lo que usted dice, es decir, cuando se bajan, si son 0, bloquean el proceso. – byrondrossos

+0

Lea la pregunta con cuidado, por favor: semop intentará bajar todo el conjunto y bloquear en todos los cero o se bloqueará en el primero (¿primero?) Encontrado 0 –

+0

Puede especificar que IPC_NOWAIT regrese inmediatamente en caso de falla. Ver: http: //pubs.opengroup.org/onlinepubs/7908799/xsh/semop.html – RedX

Respuesta

6

No hay actualizaciones hasta que todas las actualizaciones puedan continuar como una unidad.

La especificación POSIX podría ser más clara sobre este punto, aunque dice que semop es atómico.

En Linux, semop(3) en glibc es un contenedor simple alrededor de semop(2). La página de manual semop(2) a su vez dice

El conjunto de operaciones contenidas en sops se realiza en orden array, y atómicamente, es decir, las operaciones se llevan a cabo ya sea como una unidad completa, o nada en absoluto.

El HP-UX semop(2) página de manual es incluso más claro:

Semáforo operaciones de matriz son atómica en que ninguna de las operaciones del semáforo se llevan a cabo hasta que el bloqueo de las condiciones en todos los semáforos en la matriz se han eliminado.

+0

Gracias - ¿Esto significa que el proceso que intenta bajar el semid se bloqueará en el primer elemento de la matriz que es 0 y semop() deshará todos los elementos de la matriz anterior downs()? –

+0

Esto depende de la implementación. Como ejemplo, el código en Linux ipc/sem.c (función 'try_atomic_semop') hace algo similar a lo que describes. Intenta las operaciones, y si alguna de ellas bloquea, los cambios se deshacen. Pero hay un punto importante: las actualizaciones se realizan mientras se mantiene un bloqueo en el conjunto de semáforos. Por lo tanto, el estado incoherente no es visible para ninguna otra tarea: una tarea que desea cambiar el semáforo primero debe adquirir el bloqueo y una tarea bloqueada en el semáforo ya está dormida. Entonces, al final, la operación es verdaderamente atómica. –

+0

Ok, gracias, un último punto: no hay posibilidad (implementación) de que el proceso que llama a semop se bloquee en _todos los semáforos que son 0? –

Cuestiones relacionadas