PowerBuzio
Membro
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
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