Ejemplo_2.cpp

Ejercicio sala de espera y sillas con hilos y semaforos
 avatar
TomasOrtellado
c_cpp
6 days ago
2.0 kB
1
Indexable
// 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