Simples problema produtores e consumidores, mas o produtor atualiza os antigos buffers

StackOverflow https://stackoverflow.com/questions/953136

  •  11-09-2019
  •  | 
  •  

Pergunta

Vamos dizer que eu tenho dois buffers. preenchimentos produtores tamp # 1, em seguida, preenchimentos tamp # 2. O consumidor consome um tampão de cada vez, e é muito lento. Enquanto ele está consumindo tampão # 1, o produtor está pronto para preenchimento outro buffer, mas eles estão todos cheios, eo consumidor não tem terminado ainda com # 1. Assim, o produtor espera.

Em vez de espera, eu quero o produtor para atualizar o "livre" buffer. Ou seja, enquanto o consumidor está consumindo tampão # 1, o produtor deve escrever novos dados sobre tampão # 2, logo que ele tem pronto (o "Velha" de dados é substituído e perdido). Se o consumidor não tiver terminado ainda com # 1, e o produtor tem mais dados para escrever, ele deve escrever novamente em # 2, e assim por diante. Quando o consumidor finalmente consome todos os dados em # 1, que deveria começar imediatamente a consumir os dados recém-escritos em tamp # 2, eo produtor deve continuar a actualizar # 1.

(imagine o produtor está adquirindo quadros de vídeo em tempo real em alta velocidade, enquanto o consumidor está lentamente a elaborá-las; o consumidor não se importa se ele ignora alguns quadro, mas deve sempre processar o último quadro adquirido. o produtor, em vez disso, não pode abrandar, nem espera, porque ele deve adquirir cada quadro).

Existe uma maneira de fazer esse tipo de coisa com semáforos? É um bem problema de concorrência conhecido? E, no caso, é possível estender este problema para n> 2 buffers?

Obrigado!

Foi útil?

Solução

Bem, você poderia apenas ter um buffer (fila) de buffers. Algum tipo de estrutura de fila sincronizado para determinar quais os buffers estiverem a ser utilizados. Isto trabalharia para n> = 2 buffers.

Eu acho que funcionaria assim: Produtor começa a escrever para o buffer 1, mas não a remove da fila. começa consumidor consumindo de tampão 1, e remove-lo da fila. Uma vez que um tampão está cheia, os produtores verifica a fila para ver qual tampões estão disponíveis, e que só vê o tampão 2 está disponível. O produtor começa a escrever para o buffer 2. Quando tampão 2 está cheio, ele vai verificar a fila novamente e ver que tampão 2 ainda está disponível, por isso vai escrever para ele novamente. Uma vez que o consumidor é feito com tampão 1, que irá remover o tampão 2 da fila e tampão lugar uma volta. Uma vez que o produtor é feito com 2, ele verá apenas tampão 1 está disponível e começar a escrever a ele. Espero que este é o que você estava descrevendo. (Eu não gosto de lidar com apenas semáforos, eu prefiro usar estruturas de dados mais elevadas, por exemplo. Filas).

Para lidar com vários produtores, introduzir uma outra fila para determinar quais buffers estão sendo utilizados por um produtor. Então, agora você vai ter uma fila de produtor e uma fila de consumidor, e eu acho que lida com todas as suas situações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top