Demo entry 6357027

T

   

Submitted by X.c on Apr 21, 2017 at 01:32
Language: C. Code size: 3.1 kB.

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define N_CLIENTES 10
#define N_CADEIRAS 5

sem_t sem_cadeiras;        //Semáforo para cadeiras ocupadas
sem_t sem_cad_barbeiro;    //Semáforo para cadeira do barbeiro
sem_t sem_cabelo_cortado;  //Semáforo barbeiro ocupado ou não
sem_t sem_cliente_cadeira; //Semáforo para se existem clientes

//Procedimento executado pela thread do barbeiro
void *f_barbeiro(void *v)
{
    //Barbeiro executando
    while (1)
    {
        //Barbeiro cortando o cabelo de um cliente
        sem_wait(&sem_cliente_cadeira);
        //Barbeiro cortou o cabelo de um cliente
        printf("Barbeiro cortou o cabelo de um cliente.\n");
        //Barbeiro finaliza o corte e fica desocupado
        sem_post(&sem_cabelo_cortado);
    }
    return NULL;
}

//Procedimento executado pela thread dos clientes
void *f_cliente(void *v)
{
    //Cast para pega o identificador do cliente
    int id = *(int *)v;
    //Para poder ver a chegada aleatória dos clientes com mais clareza
    sleep(id % 3);
    //Verifica se tem cadeiras disponíveis
    if (sem_trywait(&sem_cadeiras) == 0)
    {
        //Cliente entra na barbearia
        printf("Cliente %d entrou na barbearia.\n", id);
        //Aguarda a cadeira do barbeiro ser liberada
        sem_wait(&sem_cad_barbeiro);
        //Cadeira liberada
        printf("Cliente %d sentou na cardeira do barbeiro.\n", id);
        //Cliente senta na cadeira do barbeiro e o libera para iniciar o corte
        sem_post(&sem_cliente_cadeira);
        //O cliente libera uma cadeira de espera
        sem_post(&sem_cadeiras);
        //Cliente está esperando o barbeiro terminar o corte
        sem_wait(&sem_cabelo_cortado);
        //Barbeiro está liberando o barbeiro para dormir ou atender
        sem_post(&sem_cad_barbeiro);
        //Cliente deixa a barbearia com cabelo cortado
        printf("Cliente %d deixou a barbearia.\n", id);
    }
    else
    {
        //Cliente vai embora por falta de cadeiras disponíveis
        printf("Cliente %d não entrou na barbearia.\n", id);
        return NULL;
    }
}

int main()
{
    //Vetor de threads indicados os clientes
    pthread_t thr_clientes[N_CLIENTES];
    //Thread do barbeiro
    pthread_t thr_barbeiro;
    //Contador auxiliar
    int i;
    //Vetor com a identificação de cada cliente
    int id[N_CLIENTES];
    //Inicializando os semáforos
    sem_init(&sem_cadeiras, 0, 5);
    sem_init(&sem_cad_barbeiro, 0, 1);
    sem_init(&sem_cliente_cadeira, 0, 0);
    sem_init(&sem_cabelo_cortado, 0, 0);
    //Criando as threads dos cliente
    for (int i = 0; i < N_CLIENTES; i++)
    {
        id[i] = i;
        pthread_create(&thr_clientes[i], NULL, f_cliente, (void *)&id[i]);
    }
    //Criando a threads do barbeiro
    pthread_create(&thr_barbeiro, NULL, f_barbeiro, NULL);
    //Aguarda a execução das threads clientes terminarem
    for (int i = 0; i < N_CLIENTES; i++)
    {
        pthread_join(thr_clientes[i], NULL);
    }
    return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).