Tento návrh představuje rozdělení hlavní struktury programu z hlediska funkčnosti. Výpis nezobrazuje vlákna jako procesy, ale struktury dat, které jednotlivá vlákna potřebují:
Global_object->thread[element]->group[element]->layer[element]->info struct
Global_object->thread[element]->group[element]->layer[element]->bmp struct
Global_object->thread[element]->group[element]->layer[element]->png struct
Global_object->thread[element]->group[element]->layer[element]->jpeg struct
Global_object->arguments
Global_object->main[element]->group[element]->layer[element]->info struct
Global_object->main[element]->group[element]->layer[element]->bmp struct
Global_object->main[element]->group[element]->layer[element]->png struct
Global_object->main[element]->group[element]->layer[element]->jpeg struct
Program by se měl automaticky spustit do threadu 0, bey ohledu na to jestli půjde o multivláknový proces. Pokud půjde o vícevláknový proces. V první threadu se rozparsují argumenty, nejen z příkazové řádky, ale i ze souborů s vrstvami, barvami, a vše se připraví. Pokud se jedná o více vláknový proces, první vlákno určí co připadne kterému vláknu. Poté co se všechny thready dokončí mohou se vlákna sama ukončit a program se ukončí nebo se přejde na main, což je to samé co vlákno, rozdíl je v tom, že main není určený na multiprocessing, ale např. ke sloučení obrázků z vláken do společného "vlákna". Bylo by možné pracovat s mainem a pak zase vše rozdělit na jednotlivé obrázky uvnitř vláken.
Příklad: zadáte příkaz na hromadné zpracování souborů. Jedná se o menší obrázky ze kterých se skládá celý obraz. Program provede konverzi do HSV, případně další akce a úpravu obrázků nebo vytvoření masek k nim. Pak přejde do "společného vlákna", v mainu vše zkompletuje do jednoho velkého bufferu (zásobníku). Nutno podotknout, že každé vlákno má své vlastní zásobníky, vždy se ale bude pracovat jen s jednou strukturou bmp, jpeg či png. Poté co jsou všechny obrazy zkompletovány v mainu, by bylo velmi dobré vyčistit všechny vlákna a uvolnit paměť těchto vláken (pokud ji však nebudu ještě potřebovat - jako že asi ano). Potom mohu provést blur masky a provést další efekty na obrazu, který nakonec opět rozdělím do menších částí a teto poslední úkon provedou opět jednotlivá vlákna. Dochází tedy ke zkopírování dat do jednotlivých vláken odkud se převedou na RGB a pak uloží. Až všechny vlákna skončí, tak mohu uvolnit paměť hlavního bufferu a paměť vláken.
Ještě podotknu že vlákna se dělí na skupiny a na vrstvy. Vrstvy by teoreticky bylo možné dělit na skupiny, tak proč toho nevyužít...
Žádné komentáře:
Okomentovat