====== 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).