Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <pthread.h>
- #include <time.h>
- #include <unistd.h>
- #include <semaphore.h>
- #include <math.h>
- //gcc -o t3 semaforo.c -pthread
- sem_t aten_sem;
- sem_t atenfull_sem;
- typedef struct{
- int idThread;
- int* buffer;
- int tam_buffer;
- } args;
- int novo_cliente(){
- int resultado;
- resultado = rand()%10;
- if(resultado > 4)
- resultado = 1;
- else
- resultado = 0;
- return resultado;
- }
- int tempo_chamada(){
- int resultado;
- resultado = rand()%10;
- if(resultado > 6)
- resultado = 1;
- else
- resultado = 0;
- return resultado;
- }
- int limpa_linha(int *buffer, int tam){
- int i;
- for(i = 0; i < tam; i++){
- buffer[i] = -1;
- }
- }
- int verifica_linha(int *buffer, int tam){
- int i, cheio;
- cheio = 0;
- for(i = 0; i < tam; i++){
- if(buffer[i] != -1) //verifica se tem algm na linha de espera, e ja retorna quantos tem
- cheio++;
- }
- return cheio;
- }
- void print_buffer(int *buffer, int tam){
- int i;
- printf("Buffer : ");
- for(i = 0; i < tam; i++){
- if(buffer[i] != -1) //verifica se tem algm na linha de espera, e ja retorna quantos tem
- printf("[%d] ", buffer[i]);
- else
- printf("[X] ");
- }
- printf("\n");
- }
- void insere_linha(int *buffer, int tam, int id){
- int i, ok;
- i = ok = 0;
- do {
- if(buffer[i] == -1){
- buffer[i] = id;
- ok = 1;
- }
- i++;
- } while((i < tam) && (ok != 1 ));
- }
- void retira_linha(int *buffer, int tam, int id){
- int i, ok;
- i;
- for(i = 0; i < tam; i++){
- if(buffer[i] == id) //verifica se tem algm na linha de espera, e ja retorna quantos tem
- buffer[i] = -1;
- }
- }
- void atendente(void *arg){
- args *vargs = (args *) arg;
- int linha;
- printf("-----------------------------------------------------------------------------------------\n");
- printf("\t\tCall center do Grisotti ( Numero de linhas de espera: %d )\n", vargs->tam_buffer);
- printf("-----------------------------------------------------------------------------------------\n");
- while(1){
- sem_wait(&atenfull_sem);
- linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
- printf("Atendente esta falando com algum cliente! Ha %d chamadas em espera\n\n", linha-1);
- do {
- sleep(2);
- } while(tempo_chamada());
- sem_post(&aten_sem);
- }
- pthread_exit(NULL);
- }
- void cliente(void *arg){
- args *vargs = (args *) arg;
- int linha, quit = 0;
- while(!quit){
- linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
- print_buffer(vargs->buffer, vargs->tam_buffer);
- if(linha == vargs->tam_buffer){
- printf("Cliente %d nao consegue realizar a chamada. Todas as linhas ocupadas\n", vargs->idThread);
- }else{
- printf("Cliente %d esta ligando. Havia %d chamadas em espera\n\n", vargs->idThread, linha);
- insere_linha(vargs->buffer, vargs->tam_buffer, vargs->idThread);
- sem_post(&atenfull_sem);
- sem_wait(&aten_sem);
- retira_linha(vargs->buffer, vargs->tam_buffer, vargs->idThread);
- linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
- print_buffer(vargs->buffer, vargs->tam_buffer);
- printf("cliente %d sendo atendido. Ha %d chamadas em espera\n\n", vargs->idThread, linha);
- }
- quit = 1;
- }
- pthread_exit(NULL);
- }
- int main(int argc, char *argv[]){
- int i, num_linhas, id_thread, tamanho_buffer;
- int *buffer;
- args *arg;
- srand(time(NULL));
- if(argc < 2){
- printf("Faltou os argumentos\n");
- return 0;
- }
- num_linhas = atoi(argv[1]);
- if(num_linhas <= 0){
- printf("Digite um numero valido para a linha de espera\n");
- return 0;
- }
- pthread_t tid;
- buffer = (int*)malloc(num_linhas*sizeof(int));
- sem_init(&aten_sem, 0, 1);
- sem_init(&atenfull_sem, 0, 0);
- limpa_linha(buffer, num_linhas);
- for(id_thread = 0;;i++){
- arg = malloc(sizeof(args));
- arg->buffer = buffer;
- arg->idThread = id_thread;
- arg->tam_buffer = num_linhas;
- if(id_thread == 0){
- if (pthread_create(&tid, NULL, (void*) atendente, (void*) arg)) {
- printf("\nerro ao criar thread atendente\n");
- exit(-1);
- }
- id_thread++;
- }
- else if(novo_cliente()){
- if (pthread_create(&tid, NULL, (void*) cliente, (void*) arg)) {
- printf("\nerro ao criar thread cliente\n");
- exit(-1);
- }
- id_thread++;
- }
- sleep(1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement