Proyecto final · Programación Concurrente

TAQUERÍADead End

Una simulación de una taquería en hora pico donde cada cliente y cada trabajador es un hilo real: meseros, cocineros, taquero del trompo, tortillera, cajero, garroteros y lavaplatos trabajan al mismo tiempo y se coordinan con semáforos, colas bloqueantes y locks. Un turno completo, de las 16:00 a la medianoche, en tres minutos.

46
hilos vivos en la hora pico
15
hilos fijos del personal y servicios
11
mecanismos de sincronización
3 min
un turno de ocho horas a 1×
60 fps
en una laptop con gráficos integrados
17
pruebas de concurrencia
Qué pasa

Una taquería, muchos hilos

Nadie espera a que otro termine para empezar, pero todos comparten recursos limitados. Cada uno de estos procesos corre en su propio hilo:

Un hilo por grupo de clientes

Llegan al azar, se forman, gastan paciencia, comen, pagan y se van. Si la fila no avanza, se cansan y se van sin entrar.

Meseros y comandas

Toman órdenes, entregan platos y cobran por prioridad. Cuelgan las comandas en un riel con cupo: si está lleno, esperan.

Cocina, trompo y comal

Los cocineros toman pastor de la charola del trompo y tortillas del comal: dos productores y varios consumidores compitiendo.

Estacionamiento

Doce cajones protegidos con un semáforo. Si el lote está lleno, el auto da vueltas a la manzana y a la tercera se va.

Ventanilla para llevar

La despachadora toma pastor de la misma charola que la cocina. Si el cliente se cansa justo al ser atendido, solo uno gana la carrera.

Limpieza y loza

Una mesa sucia no se vuelve a ocupar hasta que un garrotero la limpia. Los platos sucios llegan al lavaplatos, que lava por tandas.

Gerente y temporales

Si esperan más de seis personas, contrata un mesero y un cocinero temporales; cuando la fila se calma, los despide sin cortar su tarea.

Clima y reputación

La lluvia y el calor cambian por su cuenta y desesperan a la fila de afuera. Las reseñas del día mueven la calificación y las llegadas de mañana.

Estadísticas en vivo

Atendidos, ventas, tiempos promedio, eventos y lo que produjo cada trabajador, actualizados mientras corre y resumidos en el corte del día.

Capturas

Así se ve

Capturas de la aplicación funcionando a velocidad normal. Todo lo que se mueve es un hilo trabajando; nada está animado a mano.

dead-end / hora pico

La cocina: cocineros en sus planchas, trompo, comal y lavaplatos
La cocina: cada cocinero en su plancha con el avance de su orden, el trompo, el comal y el fregadero.
El salón con grupos en distintas etapas
El salón: grupos ordenando, esperando, comiendo y pagando, con garroteros limpiando.
La calle con autos estacionados y la ventanilla para llevar
La calle: autos que llegan en el sentido de las flechas, la fila en la banqueta y la ventanilla para llevar.
Concurrencia

Cómo está construida

Un núcleo de simulación que no sabe nada de la interfaz y una ventana en WPF que solo observa. Primitivas reales del lenguaje, sin efectos visuales que finjan concurrencia.

Hilos

Uno por actor

  • Clientes, uno por grupo
  • Personal de planta y temporal
  • Reloj, clima y generador
  • Publicador de fotos
Sincronización

Primitivas de .NET

  • SemaphoreSlim
  • BlockingCollection acotada
  • lock y ReaderWriterLockSlim
  • Interlocked y CompareExchange
Coordinación

Señales y cancelación

  • ManualResetEventSlim
  • Pausa sin consumir CPU
  • CancellationToken enlazado
  • Apagado limpio con Join
Interfaz

WPF a 60 fps

  • Fotos inmutables cada 100 ms
  • Escena en perspectiva 3/4
  • Arte horneado a mapa de bits
  • Estadísticas en vivo

«Me voy» contra «te siento»

Un grupo sin paciencia y la recepcionista intentan cambiar el mismo estado al mismo tiempo. Un comparar e intercambiar decide: solo uno gana.

Una mesa sucia no existe para nadie

Al irse un grupo, la mesa no devuelve su permiso al semáforo; solo el garrotero lo devuelve al limpiarla.

La interfaz nunca espera

El núcleo publica una foto inmutable del estado con un intercambio atómico. La ventana la lee y dibuja; no toma un solo candado de la simulación.

Todo cuadra al final

Las pruebas comprueban que los platos se conservan, que la caja cuadra, que nunca hay más autos que cajones y que todos los hilos terminan al cerrar.

Cada ejecución es distinta

Mismo programa, otro día

Las llegadas, el tamaño de los grupos, lo que piden, los tiempos y el clima se generan al azar dentro de rangos razonables. Estos son los cortes del día 1 de dos ejecuciones seguidas.

Día 1Ejecución 1Ejecución 2
Grupos que llegan8268
Personas atendidas189163
Ventas$14,283$12,353
Temporales contratados126
Espera promedio de mesa17.9 min18.3 min
Eventos del día218191
Duración real del turno03:0003:00
Trayecto

De un prototipo en Java a una taquería completa

El proyecto se rehízo dos veces hasta que la concurrencia y la escena contaran la misma historia.

Octubre 2026 · Primera versión

Java y Swing

La lógica de clientes, meseros y cocina con hilos de Java. Sirvió para encontrar el modelo; la interfaz se quedó corta.

Octubre 2026 · C# y WPF

Núcleo separado de la vista

Todo se rehízo en .NET con un hilo explícito por actor, un núcleo que no conoce la interfaz y una ventana que solo lee fotos inmutables.

Octubre 2026 · Perspectiva 3/4

Una escena que se entiende sola

Vestíbulo, salón, cocina y calle en perspectiva, con lavaplatos y taquero del trompo como hilos nuevos, día y noche, clima y reputación persistente.

Noviembre 2026 · Más taquería

Autos, comal, ventanilla y limpieza

Estacionamiento con semáforo, tortillera y comal, pedidos para llevar que compiten por el pastor, mesas sucias y garroteros. El turno completo quedó en tres minutos.

Noviembre 2026 · Entrega

Estadísticas y documentación

Barra de estadísticas en vivo, desempeño por trabajador, eventos por tipo, tiempos promedio y un corte del día completo, con su manual de usuario y documentación técnica.