The Producer/Consumer Problem, Using Semaphores

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
 
Back
Topo