Controlando o acesso à saída em aplicativos multithread
-
22-09-2019 - |
Pergunta
Eu tenho um aplicativo que cria uma fila de emprego e, em seguida, vários threads executam os trabalhos. Ao executá -los, quero dizer que eles chamam o System () com a string de trabalho.
O problema é que a saída para o stdout se parece com a saída na parte inferior da pergunta. Eu gostaria que cada aplicativo fosse separado, para que a saída fosse:
flac 1.2.1 ... ... ... flac 1.2.1 ... ... ... etc.
Estou usando programas que não tenho controle e, portanto, não posso envolver o IO em mutexes.
Como faço para que a saída pareça com o acima?
ffllaacc 11..22..11,, CCooppyyrriigghhtt ((CC)) 2000,2001,2002, 2003,220004,2 005,0200,0260,0210,0270 0 2J,o2s0h0 3C,o2a004,2005,2l0s0o6n, 007f l aJco scho mCeosa lwsiotnh AfBl OcL UcfTolEmaLecYs 1Nw.Oi2t .hW1 A,AR BRCSAoONpLTyUYrT.iE gL hYTt h Ni(OsC )W i AsR2 R0fA0rN0eT,eY2 .0s 0o 1fT,th2wi0as0r 2ei,,s2 0af0nr3de, e2y 0os0uo4 f,at 2rw0ea0 e,,2 0wa0en6ld,c 2oy0mo0eu7 ta orJ eor hd iCswotearllicsbooumnte tiotf lruaencdd iecsrot mrceiesbr utwtaieit nhi tcA oBunSndOdiLetUriT oEcnLes Yr. t Na OiT nyW pAceRo Rn`AdfNilTtaYic.o' n sfT.oh ri sTd yeiptsea if`lrfsel .ea s 'f tfwor adreet,a iandl sy.ou a e welcome to redistribute it under certain conditions. Type `flac' for details.
Solução
Em vez de usar o System () .. você poderia usar Popen (). Em seguida, leia a saída de cada criança no programa pai e faça o que quiser com ele (por exemplo, sincronize em algum mutex ao emitir cada linha).
Outras dicas
Como PNM aponta, Popen () é provavelmente o melhor caminho a percorrer. Você ainda precisa armazenar tudo o que lê no tubo e, no final, escrevê -lo para onde planeja mantê -lo sem intercalá -lo com a saída das outras chamadas Popen ().
Uma maneira mais feia, menos eficiente, mas possivelmente mais simples, é configurar seus trabalhos do sistema () para redirecionar sua saída para arquivos. Você pode ter um thread que é passado os nomes de arquivos após as chamadas do sistema () completas, que anexam o conteúdo do arquivo na íntegra à sua saída e exclui os arquivos temporários.
Ou alguma variante de ambos. Use Popen (), armazene os resultados do tubo lê em algum lugar da memória, passe o endereço de memória para o segmento de saída quando o Popen chama completo, etc.
Além do que o PNM e o Duck escreveram, você deve verificar a página do homem para obter os programas externos e verificar como eles permitem suprimir a saída desnecessária.
E em um último recurso, você pode suprimir a saída através do shell, por exemplo,
system("flac ... > /dev/null");
ou até stdout e stderr: system("flac ... 2>&1");
Eu acho que Popen () é a melhor solução, mas pode levar algum trabalho.
Solução rápida pode ser redirecionar a saída de cada aplicativo para um arquivo TMP.
Depois que todos os threads terminarem, copie os arquivos TMP para a saída padrão.
system("plop > tmp1");