Leitores e Escritores

Este projeto consiste em usar threads e semáforos variáveis de condição POSIX para contruir um sistema leitores/escritores.

Construa um sistema com threads que acessam de forma concorrente uma fila de valores inteiros. Nesse sistema existem dois tipos de threads:

  • Leitora: que percorre a fila e imprime na tela seu conteúdo e a média dos valores encontrados;
  • Escritora: que modifica o conteúdo da fila, removendo um elemento do início da fila e acrescentando um elemento no seu final.

Observe que não há condição de disputa quando somente threads leitoras acessam a fila, pois as leituras não a modificam e podem ser simultâneas. Os acessos simultâneos permitem um maior desempenho em leitura. No entanto, uma thread escritora deve ter acesso exclusivo à fila para fazer suas modificações, sem acessos concorrentes de outras threads, sejam leitoras ou escritoras, para evitar condições de disputa.

Existem três tipos de soluções para esse problema de sincronização:

  • Priorização dos leitores: sempre que um leitor quiser ler e não houver escritor escrevendo (pode haver escritor esperando), ele tem acesso à fila. Nesta solução, um escritor pode ter de esperar indefinidamente (inanição, ou starvation), pois novos leitores sempre chegam.
  • Priorização dos escritores: quando um escritor desejar escrever, mais nenhum leitor pode fazer leituras enquanto o escritor não for atendido. Nesta solução, um leitor pode ter de esperar indefinidamente (inanição), pois novos escritores sempre chegam.
  • Prioridades iguais: não há risco de inanição, pois leitores e escritores têm as mesmas chances de acesso à fila; pode haver uma queda de desempenho em relação às soluções anteriores.

Você deve pesquisar as três soluções e implementá-las, usando como estrutura de dados a fila de inteiros implementada nos projetos anteriores, threads Posix e semáforos variáveis de condição Posix. Não serão aceitas soluções empregando espera ocupada (busy-wait). Em sua implementação, use três threads leitoras (que percorrem a fila) e duas escritoras (que inserem e removem elementos da fila).

Devem ser entregues os arquivos C com as soluções implementadas separadamente, sem esquecer de identificar o(s) autor(es).