====== Leitores e Escritores ======
Este projeto consiste em usar threads e **semáforos** **variáveis de condição** POSIX para contruir um sistema leitores/escritores.
===== Problema =====
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.
===== Observações =====
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.
===== A entregar =====
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).