quinta-feira, 7 de maio de 2009

Leitores e escritores

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.

Nenhum comentário:

Postar um comentário

Seguidores