[so] [Tema2][Windows] Parametru CreatePipe
Costin Lupu
costin.lup at gmail.com
Sun Apr 2 16:29:48 EEST 2017
On 04/02/2017 03:44 PM, Darius-Florentin Neatu wrote:
> Eu intrebasem despre limita pentru nSize de la Pipe pentru ca in
> implementarea de pe Windows fac a | b | c serial. Adica dupa ce s-a
> terminat a, b incepe sa citeasca. Dupa ce s-a terminat b, c incepe sa
> citeasca.
Aici e o problemă. Subcomenzile a, b și c *trebuie* să ruleze în
paralel. De altfel ne putem gândi la operatorul '|' ca la un operator de
paralelizare, cu diferența că subcomenzile comunică între ele.
> Cu limita cel putin 20000000 pentru nSize trec toate testele local &
> vmchecker (doar 2 teste au nevoie de limita > cea default), dar as vrea
> imi iasa pipe-ul eficient si pe windows.
Ce te faci dacă între a, b și c se transferă mai mult de 20MB? Ai avut
noroc că nu e cazul în suita de teste.
> Am o varianta in care fac paralel. Ex: a | b (b sa poate citi din pipe
> imediat dupa ce a face primul write).
Asta e varianta pe care trebuie s-o implementezi.
> In do_on_pipe fac 2 threaduri:
> - thread 1: redirect, CreateProcess("a", ..), undo redirect (inchide
> handle de fisiere deschisi in redirect sau veniti de la comanda parinte
> pentru pipe - deci inchide write handle din pipe)
> - thread 2: redirect, CreateProcess("b", ...) si nu se opreste
E clar aici că procesul b așteaptă să citească ceva pentru că celălalt
capăt (cel de scriere) nu a fost închis.
> Cand rulez a | b apare in terminal tot rezultatul comenzii "a | b", am
> pus printuri in program: thread 1 asteapta procesul copil corespunzator
> lui a, face close la capatul de write, da ExitThread(cod_copil), iar
> parintele il asteapta cu success.
Ideea e să închizi în părinte capătul de scriere de îndată ce nu mai
nevoie de el, adică după CreateProcess și înainte de terminarea
procesului a. Deci ordinea ar fi:
1. CreateProcess(a)
2. CloseHandle(hWrite)
3. WaitProcess(a)
> Cu toate acestea comanda b ramane in asteptare. Eu ma asteptam ca
> aceasta abordare sa fie corecta: procesul b sa se opreasca deoarece s-a
> terminat procesul a si in thread1 am inchis capatul de write. Deci cand
> el termina de citit tot din pipe.
>
> As vrea sa stiu daca logica mea e buna. Am tot modificat configurarile,
> in niciuna nu se opreste b.
Logica pare ok. Din păcate nu pot să mă uit pe codul tău pentru că n-am
access la fișiere. Folosește uneltele de care ți-a zis și Mihai pentru a
vedea ce handle-uri rămân agățate.
> Implementarea se gaseste pe Gitlab[1]. Diferenta intre cele 2 abordari
> de la pipe o face linia 552.
> // #define PIPE_WITH_THREADS
> Afecteaza doar comportamentul functiei do_on_pipe.
>
> P.S. Am dat access pentru Costin si Razvan. Unde gasesc lista cu
> resposabilii de la tema X? (sa le pot da access tuturor pentru etapa de
> corectare)
Am acces la proiect, dar n-am acces la fișiere. Vezi că e scriptul de
care ți-a zis și Mihai mai devreme și care dă acces la toată echipa de teme.
Costin
More information about the so
mailing list