Barrier es una construcción de sincronización en la que un conjunto de procesos se sincroniza globalmente, es decir, cada proceso del conjunto llega a la barrera y espera a que lleguen todos los demás y luego todos los procesos abandonan la barrera. Sea tres el número de procesos en el conjunto y sea S un semáforo binario con las funciones habituales P y V. Considere la siguiente implementación en C de una barrera con los números de línea que se muestran a la izquierda.
void barrier (void) { 1: P(S); 2: process_arrived++; 3. V(S); 4: while (process_arrived !=3); 5: P(S); 6: process_left++; 7: if (process_left==3) { 8: process_arrived = 0; 9: process_left = 0; 10: } 11: V(S); }
Las variables process_arrived y process_left se comparten entre todos los procesos y se inicializan a cero. En un programa concurrente, los tres procesos llaman a la función de barrera cuando necesitan sincronizarse globalmente.
La implementación anterior de la barrera es incorrecta. ¿Cuál de las siguientes es verdadera?
(A) La implementación de la barrera es incorrecta debido al uso del semáforo binario S
(B) La implementación de la barrera puede provocar un interbloqueo si
se usan dos invocaciones de barrera en sucesión inmediata.
(C) Las líneas 6 a 10 no necesitan estar dentro de una sección crítica
(D) La implementación de la barrera es correcta si solo hay dos procesos en lugar de tres.
Respuesta: (B)
Explicación: es posible que el proceso llegado sea mayor que 3. No será posible que el proceso llegado vuelva a ser 3, por lo tanto, un punto muerto.
Cuestionario de esta pregunta
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA