A vida computacional ocorre num mundo cheio de informação. Muita dessa informação é guardada em bancos de dados. Quando as informações do BD estão imutáveis é uma boa hora de se ler o seu conteúdo. Quando há leitores acessando o BD não é "educado" alterar as informações dele, deve-se, portanto, esperar que todos os leitores terminem seu trabalho. Quando o BD estiver livre, o escritor pode tomá-lo para si e fazer as modificações que desejar.
Esse problema é chamado de problema dos leitores e escritores. O seguinte programa simula essa situação.
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define NUM_READERS 10
#define T_READER 1
#define T_WRITER 5
#define TRUE 1
#define FALSE 0
pthread_mutex_t mutex;
pthread_mutex_t db;
int rc = 0;
void read_data_base(int i){
printf("Leitores acessando a base de dados: %i\n",i);
}
void write_data_base(){
printf("Escritor escrevendo na base de dados\n");
}
void reader(void){
while (TRUE) {
sleep(T_READER);
pthread_mutex_lock(&mutex);
rc = rc + 1;
if (rc == 1) pthread_mutex_lock(&db);
pthread_mutex_unlock(&mutex);
read_data_base(rc);
pthread_mutex_lock(&mutex);
rc = rc - 1;
if (rc == 0) pthread_mutex_unlock(&db);
pthread_mutex_unlock(&mutex);
}
}
void writer(void){
while (TRUE) {
sleep(T_WRITER);
pthread_mutex_lock(&db);
write_data_base();
pthread_mutex_unlock(&db);
}
}
void *reader_thread(void *arg){
reader();
}
void *writer_thread(void *arg){
writer();
}
int main(){
int count=0;
pthread_t r_thread[NUM_READERS];
pthread_t w_thread;
pthread_mutex_init(&db,NULL);
pthread_mutex_init(&mutex,NULL);
pthread_create(&w_thread,NULL,writer_thread,NULL);
for(count=0;count<NUM_READERS;count++) pthread_create(&r_thread[count],NULL,reader_thread,NULL);
pthread_join(w_thread,NULL);
for(count=0;count<NUM_READERS;count++) pthread_join(r_thread[count],NULL);
return 0;
}
Nesse programa, são usados mutexes que são semáforos especiais. O mutex é um semáforo que possui apenas dois valores: 0 e 1. O mutex db garante que o escritor só acesse o BD quando estiver livre e o mutex mutex permite uma contagem confiável de leitores, pois faz a exclusão mútua no acesso à variável rc (readers count).
Uma simulação do problema é mostrado na figura abaixo.
Nesse caso, há 10 leitores e um escritor. Percebe-se que a utilização do BD é, na maior parte do tempo, feita por leitores. Pode existir uma situação em que a frequencia de acesso de leitores não permite que o escritor tenha acesso ao banco de dados.
Páginas
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário