====== Uso de semáforos ======
{{ :so:ppos_11_prodcons.mkv |Video deste projeto}}
Este projeto consiste em usar seu sistema, com as funções de semáforos implementadas no projeto anterior, para construir um sistema produtor/consumidor com //buffer// limitado.
{{ :so:coord-prodcons.png |Sistema produtor/consumidor}}
O código básico de um sistema produtor/consumidor é o seguinte:
=== Produtor ===
produtor
{
while (true)
{
task_sleep (1000)
item = random (0..99)
down (s_vaga)
down (s_buffer)
insere item no buffer
up (s_buffer)
up (s_item)
}
}
=== Consumidor ===
consumidor
{
while (true)
{
down (s_item)
down (s_buffer)
retira item do buffer
up (s_buffer)
up (s_vaga)
print item
task_sleep (1000)
}
}
===== Observações =====
* Deve ser escrito um arquivo ''pingpong-prodcons.c'', onde serão definidas as tarefas ''produtor'', ''consumidor'' e principal (''main'').
* As principais variáveis necessárias para implementar o projeto são:
* ''item'' : valor inteiro entre 0 e 99
* ''buffer'' : fila de inteiros com capacidade para até 5 elementos, inicialmente vazia, acessada com política FIFO. Pode ser implementado usando um vetor de inteiros ou a biblioteca de filas já desenvolvida.
* ''s_buffer'', ''s_item'', ''s_vaga'' : semáforos, devidamente inicializados
* O sistema implementado deve ter 3 produtores e 2 consumidores. Ele deve produzir na tela uma saída com formato similar a este:
p1 produziu 37
p2 produziu 11
c1 consumiu 37
p3 produziu 64
p1 produziu 21
c2 consumiu 11
p2 produziu 4
c1 consumiu 64
... ...
Observe que os números são consumidos na seqüência em que foram produzidos, o que caracteriza o comportamento FIFO do //buffer//.
===== Outras informações =====
* Duração estimada: 3 horas.
* Dependências:
* [[Gestão de Tarefas]]
* [[Dispatcher]]
* [[Preempção por Tempo]]
* [[Tarefas suspensas]]
* [[Tarefas dormindo]]
* [[Semáforos]]