Fire Zombie pe sistemele POSIX (Programare, Multithreading, Posix)

John Humphreys – w00te a intrebat.

Cum se formează firele zombie în C/C++ și ce trebuie să vă asigurați că faceți pentru a preveni crearea lor? Știu că sunt doar fire de execuție normale care nu s-au terminat în mod corespunzător, dar sunt puțin confuz în ceea ce privește detaliile.

2 răspunsuri
James Kanze

Un fir zombi este un fir care poate fi alăturat care s-a încheiat, dar care nu a fost alăturat. În mod normal, fie un fir ar trebui să fie alăturat la un moment dat, fie ar trebui să fie detașat. În caz contrar, sistemul de operare își menține starea pentru o posibilă viitoare alăturare, ceea ce necesită resurse.

Comentarii

  • În plus, pentru a fi reciclat, un fir care s-a încheiat trebuie să se alăture unui alt fir, iar un fir detașat trebuie să fie anulat în mod explicit (pthread_cancel) sau ieșit (pthread_exit) pentru a fi reciclat. –  > Por Arunmu.
  • @ArnuMu Un pthread este ieșit automat atunci când funcția pe care o apelează se întoarce. (Nu-mi amintesc să fi folosit vreodată pthread_exit. Și pthread_cancel poate fi complicat și nu garantează că firul se va termina. –  > Por James Kanze.
  • Aveți dreptate în ceea ce privește ieșirea automată a firului atunci când este returnat. Și eu o folosesc (în funcție de starea de spirit 🙂 ). Dar nu sunt de acord cu comentariul dvs. privind lipsa de fiabilitate a „pthread_cancel”. Poți furniza un link ca dovadă ? –  > Por Arunmu.
  • Am dat peste acest link frumos : mkssoftware.com/docs/man3/pthread_cancel.3.asp –  > Por Arunmu.
  • @ArunMu Standardul Posix. pthread_cancel solicită anularea, nu o forțează. Anularea poate avea loc numai în anumite locuri din cod; poate fi blocată de către pthread_cancel_state, , sau în anumite solicitări de sistem, și apelează gestionarii de curățare, care nu se termină neapărat (iar anularea va încheia firul doar după ce aceștia au terminat). Terminarea unui fir este o problemă complexă, iar uneori pthread_cancel este necesară, dar nu este niciodată suficientă; firul trebuie să coopereze. –  > Por James Kanze.
Jonathan Sternberg

Vă referiți la pthreads sau la procesele zombi? Un proces zombi (nu un fir de execuție) este creat atunci când un părinte nu-și culege copilul. Asta pentru că sistemul de operare păstrează starea de întoarcere a procesului în cazul în care părintele are nevoie de ea mai târziu. În cazul în care părintele moare, copilul este dat firului de init care stă și apelează „wait” la nesfârșit (culegând orice copil care moare). Așadar, un proces zombi poate fi creat numai atunci când părintele este încă în viață și copilul s-a terminat.

Același lucru este valabil și pentru pthreads. Dacă detașați firul, acesta nu va păstra starea de terminare a procesului după ce se termină (similar cu procesele).