„Szálspecifikus tároló” változatai közötti eltérés

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
B.Zsoltbot (vitalap | szerkesztései)
a AWB
Félrefordítások javítva, az angol nyelvű oldalról némi extra információ áthozva.
1. sor:
A '''szálspecifikus tároló''' (Thread local strorage, TLS) egy [[konkurens programtervezési minta]], ami lehetőséget biztosít arra, hogy egy adott szálra lokálisnézve lehessenek statikus vagy globális memóriátváltozóink, használ[[Memória (számítástechnika)|memóriaterületünk]].
 
Ezt több helyen használják, ahol az egyszálú program [[globális változó]]it helyettesítik vele, amik egy többszálú alkalmazásban nem lennének megfelelőek. Például egy errno nevű globális változót használ a sok [[C (programozási nyelv)|C]] függvény hibaállapot-tárolásra. Amennyiben ez egy darab globális változó lenne, az egyik szál által beleírt hibakódot egy másik szál felülírhatja még azelőtt, hogy az első szál által beállított hibakóddal bármilyen más kódrészlet is foglalkozott volna (tehát mielőtt lekezelte volna az adott hibát). Erre a problémára lehet megoldás jelen tervezési minta alkalmazása, amiben például a hibaállapotot jelző errno változó globálisnak néz ki a szálon belülről, viszont a valóságban ez egy adott szálra lokális.
Ezt több helyen használják, ahol az egyszálú program [[globális változó]]it helyettesítik vele. Ez bizonyos esetekben lehetséges, és szükség is lehet rá; ugyanis a változó adatok szinkronizáció nélküli megosztása szálak között hibás működést eredményezhet. Ez azt jelenti, hogy a program hibás. Ennek elkerülésének ez az egyik módja.
 
Egy másik alkalmazási lehetősége az, amikor több szál gyűjt információt egyetlen globális változóba. Ahhoz, hogy elkerüljük a [[Versenyhelyzet|versenyhelyzetet]] (race condition), kölcsönös kizárást (mutual exclusion) kell alkalmaznunk. Ennek alternatívája lehet az, hogy minden szál rendelkezik egy adott szálra lokális változóval (defínció szerint ezeket a változókat másik szálból nem lehet sem olvasni, sem írni, tehát nem léphet fel versenyhelyzet), amiben az adatokat összegezheti, gyűjtheti. Ezt követően mindösszesen annyi a dolgunk, hogy a szálak által összegyűjtött információkat akkumuláljuk egy valóban globális változóba.
Egyik lehetséges alkalmazása a hibaállapot jelzése. Például a hibaállapotot tároló errno globálisnak néz ki, de szálra lokális. Egy másik példa az akkumulátor változó, amiből van globális, és minden szálnak van egy. Egy ideig minden szál csak a sajátját frissíti, majd megpróbálja megszerezni a globálisat. Ha sikerül, akkor a saját változóját és az új adatot a globálisba akkumulálja, a sajátját pedig visszaállítja, különben a sajátját frissíti, és majd később próbálkozik újra.
 
Sok rendszer korlátozza a szálbiztos tároló méretét, gyakran erősen<ref>{{Cite web|url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms686749(v=vs.85).aspx|title=Thread MásrésztLocal nincsStorage is szükség(Windows)|accessdate=2017-12-12|work=msdn.microsoft.com|language=en}}</ref>. arraAzonban, hogyha errelegalább sokegy memóriát[[Mutató engedélyezzenek,(programozás)|mutató]]<nowiki/>ra mertelegendő mindenhelyet eltárolhatóbiztosít egya rendszer, azáltal tetszőleges méretű objektumbanmemóriablokkot használhatunk minden szál esetében, ésaminek a szálkezdőcímét tároljuk csak ennekel a szálspecifikus tárolóban, így valójában ez sem feltétlen jelent pointerétkomoly tároljakorlátozást.
 
==Windows-implementáció==
35. sor:
</source>
A [[C++11]] a thread_local kulcsszót vezeti be,><ref>Section 3.7.2 in C++11 standard</ref>, ami a következő esetekben használható:
*Névtér szintű (globális) változók
*Fájl osztályszintű változók
129. sor:
</source>
===Python===
[[Python (programozási nyelv)|Python]] 2.4-től a threading modul local osztálya használható szállokális tártároló létrehozására.
 
<source lang="python">