✅ The verified answer to this question is available below. Our community-reviewed solutions help you understand the material better.
semWait decrementa el semáforo y bloquea si el valor es negativo, y semSignal lo incrementa y desbloquea un proceso si hay alguno esperando. Este programa puede llevar a una situación de interbloqueo (deadlock)? si es así, indica cuál sería la solución? // Declaraciones globales
#define BUFFER_SIZE 5 // Tamaño máximo del buffer
semaphore mutex = 1; // Semáforo para exclusión mutua al acceder al buffer [2]
semaphore full = 0; // Semáforo que cuenta el número de elementos en el buffer [2]
semaphore empty = BUFFER_SIZE; // Semáforo que cuenta el número de espacios vacíos en el buffer [2]
item buffer[BUFFER_SIZE]; // Buffer circular compartido
int in = 0, out = 0; // Punteros para la gestión del buffer circular
// Función para simular la producción de un elemento
item generate_item() {
// Simula la producción
return some_data;
}
// Función para simular el consumo de un elemento
void consume_item(item data) {
// Simula el consumo
}
// Proceso Productor
void productor() {
item next_produced;
while (TRUE) {
next_produced = generate_item(); // Paso 1: Producir un elemento
semWait(empty); // Paso 2: Esperar si el buffer está lleno (no hay espacios vacíos) [2]
semWait(mutex); // Paso 3: Entrar en la sección crítica para acceder al buffer [2, 6]
// Sección crítica: añadir elemento al buffer
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE;
// Fin de la sección crítica
semSignal(mutex); // Paso 4: Salir de la sección crítica [2]
semSignal(full); // Paso 5: Indicar que hay un elemento más en el buffer [2]
}
}
// Proceso Consumidor
void consumidor() {
item next_consumed;
while (TRUE) {
semWait(mutex); // <--- LÍNEA CON ERROR POTENCIAL (Paso 1 del Consumidor)
semWait(full); // Paso 2: Esperar si el buffer está vacío (no hay elementos llenos) [2]
// Sección crítica: extraer elemento del buffer
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
// Fin de la sección crítica
semSignal(mutex); // Paso 3: Salir de la sección crítica [2]
semSignal(empty); // Paso 4: Indicar que hay un espacio vacío más en el buffer [2]
consume_item(next_consumed); // Paso 5: Consumir el elemento
}
}
void main() {
// Inicializar semáforos (ya hecho en las declaraciones globales)
// Lanzar procesos Productor y Consumidor en paralelo
paralelos(productor, consumidor); // Función hipotética para ejecutar hilos/procesos
}