Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas

jueves, 17 de septiembre de 2020

Código de Barbero Dormilon (C++)

Utilizando libreria thread y semaphore.
Se considera lo siguiente:
- las sillas disponibles que tiene la barberia, si estas estan llenas ya no se puede admitir clientes.
- el barbero empieza durmiendo y quien lo despierte sera el primero en atender; se tomara en cuenta el orden de llegada 

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <semaphore.h>
#include <pthread.h>
#include <windows.h>
#include <math.h>
using namespace std;
typedef enum {LLENO, CORTADO} respuesta;

#define NUM_CLIENTES 4 // Numero de clientes
#define N 3 // Numero max de clientes en la barberia

int clientes = 0; // Numero de clientes en la barberia
int quien = -1; // Cliente que esta siendo atendido

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; //para excl mutua ops monitor
pthread_cond_t silla, sillon, sube_sillon, dormir;

void pcliente(int i, char *s){printf("Cliente: %d -> %s\n",i,s);}

void pbarbero (char *s) {printf("Barbero: -> %s\n", s);}

//———————————– inicio monitor
int entra_barberia(int i) {

    pcliente(i,"ENTRO en la barberia");
    pthread_mutex_lock( &m );

    if (clientes >= N){
        pthread_mutex_unlock(&m ); return LLENO; // No cabe
    }else{
        clientes++;
        if (clientes==1) {
            pcliente(i,"DESPIERTO al barbero");
            pthread_cond_signal(&dormir);
        }else {
            pcliente(i,"ESPERO mi turno");
            pthread_cond_wait(&silla, &m );
            pthread_cond_signal(&sube_sillon);
        }
        quien = i;
        pthread_cond_wait (&sillon, &m ); /* Esperar a que acabe el corte.*/
        pcliente(i,"Se fue satisfactoriamente \n");
        pthread_mutex_unlock(&m );
        return CORTADO;
    }
}

void espera_cliente() {
    pthread_mutex_lock( &m );
    if (!clientes) {
        pbarbero("Me voy a dormir");
        pthread_cond_wait(&dormir,&m);
        pbarbero("Ya voy!!");
    }
    else {
        pbarbero("Que pase el siguiente...");
        pthread_cond_signal(&silla );
        pthread_cond_wait(&sube_sillon,&m);
    }
    pthread_mutex_unlock( &m);
}

void fin_corte() {
    pthread_mutex_lock(&m);
    pthread_cond_signal(&sillon); clientes--; pbarbero("FIN CORTE");
    pthread_mutex_unlock(&m);
}

void corta_pelo() {
    int r=rand()%10000;
    //usleep(10); (con sube_sillon, ya no es necesario)
    pthread_mutex_lock(&m ); // Protege el acceso a la variable “quien”
    pbarbero("Cortando el pelo.....");
    printf(" al cliente %d (%d useg.)\n",quien,r);
    pthread_mutex_unlock(&m );
    Sleep(r);
}

void da_una_vuelta(int i, int t) {
    pcliente(i,"Voy a dar una vuelta");
    printf(" durante (%d useg.)\n",t);
    Sleep(t);
    pcliente(i,"Vengo de dar una vuelta");
}
// ——————————- fin monitor

void *cliente(void *arg) {
    int i=(intptr_t) arg;
    do {
        da_una_vuelta(i,rand()%10000);
    } while (entra_barberia(i)==LLENO);
}

void *barbero(void *arg) {
    while (1) {
        espera_cliente();
        corta_pelo();
        fin_corte();
    }
}

int main(void) {
    int i;
    pthread_t id_clientes[NUM_CLIENTES], id_barbero;
    srand( (unsigned)time( NULL ) );

    pthread_cond_init(&silla, 0);
    pthread_cond_init(&sillon, 0);
    pthread_cond_init(&sube_sillon, 0);
    pthread_cond_init(&dormir, 0);

    pthread_create(&id_barbero, NULL, barbero, NULL); Sleep(1);
    for (i=0; i<NUM_CLIENTES; i++) pthread_create(&id_clientes[i], NULL, cliente, (void *) i);
    for (i=0; i<NUM_CLIENTES; i++) pthread_join(id_clientes[i], NULL);
}

Ejecución del programa:



lunes, 31 de agosto de 2020

Problema de escritor y lector (SEMAPHORE) CASO PRIORIDAD LECTOR

El problema de los lectores y escritores tiene distintas versiones, depende a quien le damos prioridad.

Prioridad al Lector:

Recursos a utilizar

  • Variable entera nl = 0
  • Un semáforo mutex inicializado a 1
  • Un semáforo write inicializado a 1 // este semáforo es compartido para los dos procesos

Diagrama de flujo:


Nota: cuando el semáforo write tenga el valor 0, va ha impedir que el escritor pueda acceder al recurso dando una solución para priorizar al lector. Pero en este caso no garantiza la equitativamente ni exclucion mutua, ya que lleguen continuamente lectores y no dejan al escritor acceder al recurso.

Si estas leyendo.... comparte esta publicación para que los demás le puedan llegar la información también... ellos te agradecerán.

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/

viernes, 21 de agosto de 2020

Separar una Lista en c++

El ejercicio plantea que los nodos de la lista se separen en dos listas, en la cual los nodos pares deben ingresar a una nueva lista y los nodos impares también deben ingresar a una nueva lista.



Descargar Solución:


Nota: El código esta hecho con POO, en el cual es una de las soluciones posibles, encuentre otra solución.

Eliminar Datos Repetidos de una Lista en C++

 El ejercicio es simple solo debe eliminar los datos repetidos de una lista sin que este pierda los enlaces con los nodos siguiente.

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/


Descargar Solución:

Código: http://raboninco.com/1qiNa


Cubo Mágico en C++

El ejercicio del Cubo Mágico debe dar como resultado que las lineas horizontales, verticales y diagonales su suma deben ser iguales, tambien debe contar que la matriz debe ser con dimensión impar.

Solución presentada en C++ en el código hay comentarios que te pueden hacer de guía como funciona el código. Cabe recalcar que el código es una de las tantas soluciones que puede haber para solucionar el problema.

Código: http://raboninco.com/1qhEt

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/


Matriz en espiral

Solución presentada en C++; el recorrido empieza desde el centro de la matriz y el recorrido debe ser en forma de espiral, tomando en cuenta que la dimension de la matriz debe ser impar y no debe tomar encuenta las dimensiones negativas. Cabe recalcar que el codigo es una de las tantas soluciones que puede haber para solucionar el problema.

Código: http://raboninco.com/1qgsb

Pagina Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/