posix pipe como uma fila de trabalho
s implementações normais de uma fila de trabalho que vi envolvem mutexes e variáveis de condiçã
ConsumidorA) Acquires Lock
B) While Queue empty
Wait on Condition Variable (thus suspending thread and releasing lock)
C) Work object retrieved from queue
D) Lock is released
E) Do Work
F) GOTO A
ProdutorA) Acquires Lock
B) Work is added to queue
C) condition variable is signaled (potentially releasing worker)
D) Lock is released
Estive navegando em algum código e vi uma implementação usando os tubos POSIX (nunca vi essa técnica antes
ConsumidorA) Do select on pipe (thus suspending thread while no work)
B) Get Job from pipe
C) Do Work
D) GOTO A
ProdutorA) Write Job to pipe.
Desde que o produtor e o consumidor são threads dentro do mesmo aplicativo (portanto, eles compartilham o mesmo espaço de endereço e, portanto, os ponteiros entre eles são válidos); os trabalhos são gravados no canal como o endereço do objeto de trabalho (objeto A C ++). Portanto, tudo o que precisa ser escrito / lido no canal é um endereço de 8 byte
Minha pergunta é
Essa é uma técnica comum (fui protegida disso) e quais são as vantagens / desvantagens?Minha curiosidade foi despertada porque a técnica de tubulação não envolve nenhum bloqueio ou sinal visível (pode estar oculta na seleção). Então, eu queria saber se isso seria mais eficiente?
EditarCom base nos comentários na resposta de Maxim Yegorushki
Na verdade, o "Produtor" nesse cenário está envolvido em um monte de E / S de alto volume de várias fontes em paralelo. Por isso, suspeito que o autor original, apesar de muito desejável que esse encadeamento não bloqueie sob nenhuma circunstância, mas também não queira trabalhos de alto custo no encadeamento "Producer"