This shows you the differences between two versions of the page.
so:laboratoare-2013:resurse:threaduri_extra [2017/04/10 17:20] adrian.stanciu [Modificarea dimensiunii și adresei de start a stivei] |
so:laboratoare-2013:resurse:threaduri_extra [2017/04/11 10:48] (current) adrian.stanciu [Modificarea dimensiunii și adresei de start a stivei] |
||
---|---|---|---|
Line 56: | Line 56: | ||
Atributele unui fir de execuţie (cu o excepţie) sunt specificate la crearea firului de execuţie și __nu pot fi schimbate__ pe perioada în care firul de execuţie este folosit. | Atributele unui fir de execuţie (cu o excepţie) sunt specificate la crearea firului de execuţie și __nu pot fi schimbate__ pe perioada în care firul de execuţie este folosit. | ||
- | Pentru __iniţializarea__ și respectiv __distrugerea__ unui obiect ce reprezintă atributele unui fir de execuţie avem la dispoziţie funcţiile : | + | Pentru __iniţializarea__ și respectiv __distrugerea__ unui obiect ce reprezintă atributele unui fir de execuţie avem la dispoziţie funcţiile: |
<code c> | <code c> | ||
Line 63: | Line 63: | ||
</code> | </code> | ||
- | Pentru a stabili anumite atribute specifice ale unui fir, trebuie urmaţi câţiva pași : | + | Pentru a stabili anumite atribute specifice ale unui fir, trebuie urmaţi câţiva pași: |
- | # se creează un obiect de tipul ''pthread_attr_t'', de exemplu declarând o variabilă de acest tip. | + | * se creează un obiect de tipul ''pthread_attr_t'', de exemplu declarând o variabilă de acest tip. |
- | # se apelează funcţia ''pthread_attr_init'' căreia i se dă ca parametru un pointer la acest obiect. Această funcţie iniţializează atributele cu valorile lor implicite. | + | * se apelează funcţia ''pthread_attr_init'' căreia i se dă ca parametru un pointer la acest obiect. Această funcţie iniţializează atributele cu valorile lor implicite. |
- | # se modifică obiectul ce contine atributele folosind una din funcţiile prezentate mai jos, pentru ca să se obţină atributele dorite. | + | * se modifică obiectul ce contine atributele folosind una din funcţiile prezentate mai jos, pentru ca să se obţină atributele dorite. |
- | # se transmite un pointer la aceste atribute funcţiei ''pthread_create''. | + | * se transmite un pointer la aceste atribute funcţiei ''pthread_create''. |
- | # se apelează funcţia ''pthread_attr_destroy'' pentru a elibera obiectul ce reprezintă atributele (variabila de tip ''pthread_attr_t'' nu este însă dezalocată, ea poate fi refolosită utilizând ''pthread_attr_init''). | + | * se apelează funcţia ''pthread_attr_destroy'' pentru a elibera obiectul ce reprezintă atributele (variabila de tip ''pthread_attr_t'' nu este însă dezalocată, ea poate fi refolosită utilizând ''pthread_attr_init''). |
Un același obiect de tip ''pthread_attr_t'' poate fi folosit pentru crearea mai multor fire de execuţie distincte și nu este necesar să fie păstrat după crearea acestora. | Un același obiect de tip ''pthread_attr_t'' poate fi folosit pentru crearea mai multor fire de execuţie distincte și nu este necesar să fie păstrat după crearea acestora. | ||
Line 77: | Line 77: | ||
==== Modificarea atributului detașabil/unificabil ==== | ==== Modificarea atributului detașabil/unificabil ==== | ||
- | Pentru a seta/verifica tipul unui fir de execuţie din punct de vedere detașabil/unificabil se pot utiliza următoarele funcţii : | + | Pentru a seta/verifica tipul unui fir de execuţie din punct de vedere detașabil/unificabil se pot utiliza următoarele funcţii: |
<code c> | <code c> | ||
Line 86: | Line 86: | ||
Primul parametru este un pointer la obiectul reprezentând atributele, iar al doilea parametru reprezintă starea dorită - unificabil/detașabil. Deoarece implicit sunt create fire unificabile (valoarea ''PTHREAD_CREATE_JOINABLE''), această funcţie trebuie apelată doar dacă se creează fire detașabile și în acest caz al doilea parametru trebuie să aibă valoarea ''PTHREAD_CREATE_DETACHED''. | Primul parametru este un pointer la obiectul reprezentând atributele, iar al doilea parametru reprezintă starea dorită - unificabil/detașabil. Deoarece implicit sunt create fire unificabile (valoarea ''PTHREAD_CREATE_JOINABLE''), această funcţie trebuie apelată doar dacă se creează fire detașabile și în acest caz al doilea parametru trebuie să aibă valoarea ''PTHREAD_CREATE_DETACHED''. | ||
- | Chiar dacă un fir de execuţie este creat unificabil, el poate fi transformat ulterior într-un fir detașabil apelând funcţia ''pthread_detach''. Însă o data detașat, nu mai poate fi făcut unificabil la loc. | + | Chiar dacă un fir de execuţie este creat unificabil, el poate fi transformat ulterior într-un fir detașabil apelând funcţia ''pthread_detach''. Însă detașat, nu mai poate fi refăcut unificabil. |
==== Modificarea politicii de alocare a procesorului ==== | ==== Modificarea politicii de alocare a procesorului ==== | ||
- | Standardul POSIX definește 3 politici de alocare a procesorului : | + | Standardul POSIX definește 3 politici de alocare a procesorului: |
*SCHED_RR - round robin | *SCHED_RR - round robin | ||
Line 98: | Line 98: | ||
Politicile SCHED_RR și SCHED_FIFO sunt opţionale și sunt suportate DOAR de firele de execuţie real time. | Politicile SCHED_RR și SCHED_FIFO sunt opţionale și sunt suportate DOAR de firele de execuţie real time. | ||
- | Funcţia care este folosită pentru a schimba politica de execuţie a firelor este : | + | Funcţia care este folosită pentru a schimba politica de execuţie a firelor este: |
<code c> | <code c> | ||
Line 112: | Line 112: | ||
==== Modificarea priorităţii ==== | ==== Modificarea priorităţii ==== | ||
- | Pentru a schimba/verifica prioritatea firelor de execuţie dispunem de următoarele funcţii : | + | Pentru a schimba/verifica prioritatea firelor de execuţie dispunem de următoarele funcţii: |
<code c> | <code c> | ||
Line 127: | Line 127: | ||
Dacă firul a fost creat unificabil stiva nu poate fi eliberată până nu se va termina un apel ''pthread_join'' pentru respectivul fir. | Dacă firul a fost creat unificabil stiva nu poate fi eliberată până nu se va termina un apel ''pthread_join'' pentru respectivul fir. | ||
- | De obicei biblioteca de fire de execuţie alocă 1M de memorie virtuală pentru fiecare stivă de fir de execuţie. | + | De obicei biblioteca de fire de execuţie alocă 2M de memorie virtuală pentru fiecare stivă de fir de execuţie. |
Limita minimă pentru dimensiunea unei stive a unui fir de execuţie este PTHREAD_STACK_MIN. | Limita minimă pentru dimensiunea unei stive a unui fir de execuţie este PTHREAD_STACK_MIN. |