Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <winsock.h>
- #include <string.h>
- #include <malloc.h>
- //Tamanho da fila de impressao
- #define TAMANHO_FILA 5//Limitar impede o consumo de memoria pelo thread2
- /* DECLARAÇÕES GLOBAIS */
- //~~thread's
- void *runn_thr1(void *);//thread 1 (gerenciador de fila)
- void *runn_thr2(void *);//thread 2 (impressor)
- void init_threads();//inicia threads
- pthread_mutex_t vblock_gfila;//Variavel de bloqueio - thread 1
- pthread_mutex_t vblock_imp;//Variavel de bloqueio - thread 2
- pthread_t thr1,**thr2;//variaveis do thread
- //~~menu
- int menu();
- //~~variaveis globais - uso ativo de thread
- bool add_fila = false; //sinalizador - adicionar arquivo a fila
- bool imp_arquivo = false;//sinalizador - imprimir arquivo na fila
- int fila_count = 0;//Armazena quantidade de arquivos na fila
- int thr2id = 0;
- //Arquivo a ser impresso
- struct Arquivo
- {
- //Dados comuns de um arquivo a ser impresso
- char *nome;
- //Limpar variaveis
- void clear(){
- nome = NULL;
- };
- //Altera nome do arquivo - ja aloca de acordo com a string enviada
- void set(const char *str){
- nome = (char *)malloc(sizeof(char *)*strlen(str));
- strcpy(nome, str);
- };
- };
- //Arquivo temporario - usado para passar dados, do processo principal para o thread 1, depois para o thread 2
- Arquivo file_temp;
- Arquivo **fila_thr2;//usar esse objeto para armazenar as informacões dos 'arquivos' da fila
- /* FIM DECLARAÇÕES GLOBAIS */
- int main(){
- init_threads();//inicia threads
- menu();//menu
- return 0;
- }
- //Mostra menu na tela, executa funções do menu
- int menu(){
- int r = 0,l = 1;
- //Aloca vetor da fila e thread2
- fila_thr2 = (Arquivo **)malloc(sizeof(Arquivo *)*TAMANHO_FILA);
- thr2 = (pthread_t **)malloc(sizeof(pthread_t *)*TAMANHO_FILA);
- for(int i = 0; i < TAMANHO_FILA; i++){
- fila_thr2[i] = NULL;
- thr2[i] = NULL;
- }
- while(l){
- //Limpa dados de entrada
- fflush(stdin);
- //Texto do menu
- printf(" == MENU == \n");
- printf("1 - Imprimir arquivos em fila \n");
- printf("2 - Adicionar arquivo a fila de impressao \n");
- printf("3 - Ver fila de impressao\n");
- printf("0 - Sair \n");
- printf("\n>");
- scanf("%d",&r);
- if(r == 0) break;
- switch(r){
- case 1://Imprimir arquivos da fila
- imp_arquivo = true;//Sinaliza impressao
- break;
- case 2://Adicionar arquivo
- {
- //Fila cheia
- if(fila_count >= TAMANHO_FILA){
- printf("Fila cheia! Tente mais tarde.\n");
- break;
- }
- //Alocando memoria - struct Arquivo
- file_temp.nome = (char *)malloc(sizeof(char *)*128);
- //Questionario
- printf("Digite o nome do arquivo(128):");
- scanf("%s",file_temp.nome);
- //Enviar para thread 1
- add_fila = true;
- }
- break;
- case 3://Mostrar Fila
- {
- if(fila_count <= 0){
- printf("Fila vazia! Tente mais tarde.\n");
- break;
- }
- int i;
- for(i = 0; i < TAMANHO_FILA; i++){
- if(fila_thr2[i] != NULL){
- printf("[%d] - %s\n",i,fila_thr2[i]->nome);
- }
- }
- }
- break;
- case 0:
- l = 0;
- break;
- }
- }
- }
- /*thread para efeutar compra, verificar saldo, etc*/
- void *runn_thr1(void *){
- Arquivo thr_tmp; // Armazena arquivo temporario, mesmo que mudo o global(file_temp)
- while(1){//Loop eterno até que seja interrompido ou um arquivo esteja para ser adicionado
- if(add_fila){//Solicitação para adicionar na fila
- add_fila = false;
- pthread_mutex_unlock(&vblock_gfila);//Impede dupla solicitação
- //Copia dados do arquivo para o struct thr_tmp do thread1
- thr_tmp.set(file_temp.nome);
- file_temp.clear();
- Sleep(5000);//Delay de solicitação - so assim é possivel perceber o uso do pthread_mutex_unblock.
- thr2id = 0;//slot thread
- //Encontra um slot vazio para colocar o arquivo na fila
- for(int i = 0; i < TAMANHO_FILA; i++){
- if(fila_thr2[i] == NULL){
- printf("Slot %d livre.\n",i);
- //Aloca vetores - Arquivo * e pthread_t
- fila_thr2[i] = (Arquivo *)malloc(sizeof(Arquivo *));
- thr2[i] = (pthread_t *)malloc(sizeof(pthread_t *));
- thr2id = i;
- //Adiciona nome do arquivo na estrutura da fila
- fila_thr2[i]->set(thr_tmp.nome);
- printf("Arquivo %s adicionado a fila!\n",fila_thr2[i]->nome);
- //Cria thread 2
- pthread_create(thr2[i],NULL,runn_thr2,NULL);
- //Aumenta contagem
- fila_count++;
- break;
- }
- }
- //Valor se encontra 0 pois não foi modificado acima
- if(thr2id == 0){
- printf("Nao foi possivel adicionar arquivo %s a fila.\n",thr_tmp.nome);
- }
- pthread_mutex_unlock(&vblock_gfila);//Desbloqueia variavel para outra soliciatação de compra
- }
- }
- }
- //Thread que imprimi arquivos
- void *runn_thr2(void *){
- int id = thr2id;//Slot do thread
- thr2id = -1;
- while(1){
- //Imprimir arquivos - so quando receber o sinal do usuario
- if(imp_arquivo){
- while(pthread_mutex_unlock(&vblock_imp) < 1){}//Impede dupla impressao - bloqueia variavel ou espera desbloquear
- printf("Arquivo %s imprimido!\n",fila_thr2[id]->nome);//Output
- fila_thr2[id] = NULL;//Esvazia slot da fila
- fila_count--;//Aumenta contagem
- pthread_mutex_unlock(&vblock_imp);//Impede dupla impressao - bloqueia variavel ou espera desbloquear
- break;
- }
- }
- }
- //Inicia thread 1
- void init_threads(){
- pthread_create(&thr1,NULL,runn_thr1,NULL);//Cria thread 1
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement