Ejemplo_2.cpp
Ejercicio sala de espera y sillas con hilos y semaforosTomasOrtellado
c_cpp
10 months ago
2.0 kB
10
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;
}
Editor is loading...
Leave a Comment