1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

The Producer/Consumer Problem, Using Semaphores

Discussão em 'Programação' iniciada por PowerBuzio, 29 de Dezembro de 2007. (Respostas: 0; Visualizações: 457)

  1. Boas,

    Tenho, para um trabalho de sistemas operativo, o seguinte problema:

    Existem 2 buffers(arrays) com tamanho por exemplo 5, nos quais se colocam mensagens(estruturas com conteúdo que não interessa para a questão).

    São criadas 2 threads, uma produtora e outra consumidora, a primeira insere as mensagens num dos buffers, caso este se encontre vazio. Note-se que quando um buffer estiver cheio a thread pode escrever de seguida no outro buffer. A segunda limita-se a, caso um dos buffers esteja cheio, retire os seus elementos.

    Ambas as threads são criadas pelo mesmo processo, assim escolhi a utilização de semaforos posix.


    Em pseudocódigo o que tenho é:

    sem_t *buffer1_empty;
    sem_t *buffer1_full;
    sem_t *buffer2_empty;
    sem_t *buffer2_full;
    pthread_mutex_t mutexbuffer1;
    pthread_mutex_t mutexbuffer2;


    producer(* int){


    if(sem_trywait(buffer1_empty)==0){
    pthread_mutex_lock(&mutexbuffer1);
    "preenche o buffer";
    sem_post(&buffer1_full);
    pthread_mutex_unlock(&mutexbuffer1);

    }else if(sem_trywait(buffer2_empty)==0){

    pthread_mutex_lock(&mutexbuffer2);
    "preenche o buffer";
    sem_post(&buffer2_full);
    pthread_mutex_unlock(&mutexbuffer2);

    }

    }


    reader(int*){

    if(sem_trywait(buffer1_full)==0){
    pthread_mutex_lock(&mutexbuffer1);
    "le do buffer";
    sem_post(&buffer1_empty);
    pthread_mutex_unlock(&mutexbuffer1);

    }else if(sem_trywait(buffer2_full)==0){

    pthread_mutex_lock(&mutexbuffer2);
    "le do buffer";
    sem_post(&buffer2_empty);
    pthread_mutex_unlock(&mutexbuffer2);

    }



    }



    O programa funciona correctamente durante algum tempo, ocorrendo um segmentation fault posteriormente. Já fiz o debug mas não cheguei a qualquer conclusão. Qualquer ajuda é bem vinda.

    Obrigado
     

Partilhar esta Página