A multithreaded emergency dispatching system written in C (C11), implementing message queues, concurrency control, and digital-twin responders.
This project simulates a real-time emergency management platform where emergencies are received, queued, prioritized, and assigned to available responders.
The system is composed of multiple modules (dispatcher, queue, responders, logger...) and relies on:
- C11 threads (
thrd_t) - POSIX message queues
- Mutexes (
mtx_t) - Priority-based emergency scheduling
- Separate threads for responders returning from missions
The goal is to reproduce realistic emergency handling: reception, prioritization, assignment, mission duration, and responder return.
Incoming emergencies are sent through a POSIX message queue and handled asynchronously by the system.
Emergencies are stored in a priority queue, ordered by:
- Severity
- Timestamp (FIFO within same severity)
A dedicated dispatcher thread:
- Monitors the priority queue
- Assigns emergencies to available responders (digital twins)
- Spawns mission threads to simulate real-world timing
- Logs every relevant event
Each responder:
- Can handle one emergency at a time
- Has a dedicated thread simulating mission duration
- Returns asynchronously, notifying the dispatcher of availability
Every event (enqueue, dequeue, assignment, completion…) is recorded through a centralized logger.
- Proper initialization and destruction of mutexes
- Graceful shutdown
dispatcher_destroy()correctly releases resources
╔═══════════════════════╗
║ Emergency ║
║ Sender ║
╚═══════════════════════╝
│
▼
╔══════════════════════════════╗
║ POSIX Message Queue ║
╚══════════════════════════════╝
│
▼
╔══════════════════════════════╗
║ Emergency Receiver ║
╚══════════════════════════════╝
│
▼
╔══════════════════════════════╗
║ Priority Queue ║
║ (protected by a mutex lock) ║
╚══════════════════════════════╝
│
▼
╔══════════════════════════════╗
║ Dispatcher ║
║ (thread + queue mutex) ║
╚══════════════════════════════╝
│
assigns emergencies to available units
│
▼
╔════════════════════╗ ╔════════════════════╗
║ Responder #1 ║ ... ║ Responder #N ║
║ (thread: mission) ║ ║ (thread: mission) ║
╚════════════════════╝ ╚════════════════════╝
/src
├── dispatcher.c / dispatcher.h
├── emergency.c / emergency.h
├── queue.c / queue.h
├── responder.c / responder.h
├── logger.c / logger.h
├── utils.c / utils.h
├── main.c
- dispatcher/ → core scheduling logic, mutex-protected queue, responder assignment
- queue/ → priority queue implementation
- responder/ → thread routines for emergency missions
- logger/ → thread-safe logging
- main.c → initialization, configuration, startup and shutdown
- GCC or Clang
- POSIX-compliant environment (Linux, macOS)
- Make
make./emergency_system[INFO] Emergency received: ID=42, PRIORITY=3
[INFO] Added to priority queue
[INFO] Dispatcher assigning emergency 42 to Responder #2
[INFO] Responder #2 started mission (duration: 12s)
[INFO] Responder #2 returned from mission-Concurrency and synchronization
-Thread lifecycle management
-Message-passing via POSIX MQ
-Priority-based scheduling
-Realistic simulation of time-based processes
-Modular design and clean architecture
Alessandro Han
Computer Science, University of Pisa
LinkedIn: https://www.linkedin.com/in/alessandro-han-b87391223/