#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t semaforo_impresora;
sem_t semaforo_disco;

void* proceso_1(void* arg) {
    // 1. Pide la Impresora primero
    sem_wait(&semaforo_impresora);
    printf("Proceso 1 bloqueó la Impresora.\n");
    
    sleep(1); // Pausa para forzar que el Proceso 2 alcance a pedir el Disco
    
    // 2. Intenta pedir el Disco (Aquí se quedará congelado)
    printf("Proceso 1 esperando por el Disco...\n");
    sem_wait(&semaforo_disco); 
    
    // Nunca llegará a estas líneas
    sem_post(&semaforo_disco);
    sem_post(&semaforo_impresora);
    return NULL;
}

void* proceso_2(void* arg) {
    // 1. Pide el Disco primero
    sem_wait(&semaforo_disco);
    printf("Proceso 2 bloqueó el Disco.\n");
    
    sleep(1); // Pausa
    
    // 2. Intenta pedir la Impresora (Aquí se quedará congelado)
    printf("Proceso 2 esperando por la Impresora...\n");
    sem_wait(&semaforo_impresora); 
    
    // Nunca llegará a estas líneas
    sem_post(&semaforo_impresora);
    sem_post(&semaforo_disco);
    return NULL;
}

int main() {
    pthread_t h1, h2;
    
    sem_init(&semaforo_impresora, 0, 1);
    sem_init(&semaforo_disco, 0, 1);
    
    pthread_create(&h1, NULL, proceso_1, NULL);
    pthread_create(&h2, NULL, proceso_2, NULL);
    
    pthread_join(h1, NULL);
    pthread_join(h2, NULL);
    
    return 0;
}