Ejemplo_2.cpp
Ejercicio sala de espera y sillas con hilos y semaforos// Ejercicio sala de espera y sillas con hilos y semaforos #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> #include <vector> #include <chrono> // numero de sillas disponibles const int NUM_SILLAS = 3; // variables para implementar un semaforo manual con orden std::mutex mtx; std::condition_variable cv; int sillas_ocupadas = 0; std::queue<int> cola_turnos; // cola para mantener el orden de los turnos void personaEntra(int id) { { std::unique_lock<std::mutex> lock(mtx); cola_turnos.push(id); // agregar la persona a la cola std::cout << "Persona " << id << " quiere una silla.\n"; } { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [&] { return sillas_ocupadas < NUM_SILLAS && cola_turnos.front() == id; }); // ccupa una silla sillas_ocupadas++; cola_turnos.pop(); // elimina a la persona de la cola std::cout << "Persona " << id << " se sienta en una silla.\n"; } // Simula que la persona ocupa la silla por un tiempo std::this_thread::sleep_for(std::chrono::seconds(2)); { std::unique_lock<std::mutex> lock(mtx); // libera la silla sillas_ocupadas--; std::cout << "Persona " << id << " se levanta y deja la silla.\n"; // notifica a las personas que est�n esperando cv.notify_all(); } } int main() { // simula a 10 personas que quieren entrar a la sala const int NUM_PERSONAS = 10; std::vector<std::thread> personas; for (int i = 0; i < NUM_PERSONAS; ++i) { personas.emplace_back(personaEntra, i + 1); } // esperamos a que todas las personas terminen for (auto& t : personas) { t.join(); } std::cout << "Todas las personas han pasado por la sala de espera.\n"; return 0; }
Leave a Comment