[OSy] Dealokovanie detached vlakna po normalnom skonceni

Petr Tuma petr.tuma at d3s.mff.cuni.cz
Thu Nov 4 12:21:32 CET 2010


Dobry den,

> :) OK, tak to asi zvladnem nejakym garbage collectorom.

No a to je prave to slozite reseni :-) co treba pridat do thread
struktury boolean flag "destroy me on context switch" a modifikovat
context switch tak, aby v pripade nastaveni tohoto flagu behem prepinani
kontextu udelal ten free ... ?

> Este pridam otazku, ze ci mozu dva thready volat rozne metody
> thread_xxx na jednu thread_t.
>
> Tym by sa mi mohlo stat, ze jeden ide thread killnut - je na
> zaciatku funkcie thread_kill, este nezakazal interrupty. schedule.
> druhe vbehne do metody thread_join povedzme, je na zaciatku,
> nestihol zakazat interrupty. schedule.
>
> prvy killne a uvolni vlakno.schedule.
>
> druhy zakaze interrupty a saha na dealokovanu pamat lebo mu vlakno
> zmizlo pod rukami. A to sa mu stalo, lebo mu zradny kolega poslal
> svoj thread_t handle (co je u nas pointer na strukturu thread).
>
> V zadani nie je vyslovene napisane (alebo som zas noob?) ze ci to je
> dovolene/zakazane takto tie vlakna pouzivat. Ak je to dovolene, musim
> si navzdy pamatat nejake handles vlaken s tym, ze toto je platne a
> pointer je tam, toto je neplatne, daj volajucemu facku.

Obecne je v takovemhle pripade dobre kouknout na pozadavky v zadani. 
Zadani vyslovene rika, ze funkce pro praci s vlakny maji byt schopne 
poznat neplatne identifikatory vlaken. Vedle toho je asi jasne, ze 
kernel nema zadne veci, kterych je potencialne neomezeny pocet, alokovat 
nekonecne dlouho. Z techto dvou veci dohromady vyplyva, ze 
identifikatory vlaken mohou byt zneplatneny a casem prideleny jinemu 
vlaknu, a z toho dal vyplyva ze veci jako paralelni kombinace 
thread_kill s jinym volanim budou mit vzdy potencialni race (protoze 
kdyz neumite zajistit, aby se thread_kill udelal jako posledni operace 
na danem thread ID, tak soucasne neumite zajistit, ze jine funkce volane 
na stejnem thread ID omylem nebudou manipulovat s jinym vlaknem).

Tedy shrnul bych to asi tak: volani thread_kill a thread_join (a 
thread_detach, svym zpusobem) maji jako jednu z dulezitych vlastnosti 
to, ze soucasne zneplatnuji dane thread ID. Pokud nekdo vola API tak, ze 
je mozne toto neplatne thread ID jeste znovu pouzit, tak je to jasne 
jeho chyba (ale kernel by to nemelo zborit).

Petr Tuma





More information about the NSWI004 mailing list