Szálspecifikus tároló

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 nézve lehessenek statikus vagy globális változóink, 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 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.

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 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 csak annyi a dolgunk, hogy a szálak által összegyűjtött információkat akkumuláljuk egy valóban globális változóba.

Sok rendszer korlátozza a szálbiztos tároló méretét, gyakran erősen.[1] Azonban, ha legalább egy mutatóra elegendő helyet biztosít a rendszer, azáltal tetszőleges méretű memóriablokkot használhatunk minden szál esetében, aminek a kezdőcímét tároljuk csak el a szálspecifikus tárolóban, így valójában ez sem feltétlen jelent komoly korlátozást.

Windows-implementáció

A TlsAlloc API függvény használható arra, hogy lefoglaljon egy TLS slot indexet, ami még nincs használatban. Ezután az index használttá válik.

A TlsGetValue és TlsSetValue függvények használhatók a TLS slot index által azonosított szállokális változó memóriahelyének írására és olvasására. A TlsSetValue csak az aktuális szál változójához fér hozzá. A TlsFree függvény felszabadítja a TLS slot indexet.

Minden szálban van egy Win32 Thread Information Block. Ennek egy bejegyzése a szállokális tár táblája. A TlsAlloc visszaad egy indexet ennek a táblának, ami minden hívás esetén más. Emiatt minden szál függetlenül hívhatja a TlsSetValue(index) függvényt, és a specifikált értékkel a TlsGetValue(index) függvényt, mivel ezek a szál saját szálspecifikus tárolójában állítanak be vagy keresnek meg egy értéket.

A TlsXxx függvényektől függetlenül a Windowson futó programok definiálhatnak egy szakaszt, amelyek futtatás alatt minden szálra más lapra képeződik le.A TlsXxx függvényektől eltérően bármely érvényes címet tartalmazhatnak. Ezek azonban szintén szálspecifikusak, ezért nem szabad őket átadni. A TLS szakaszokat memórialapozás kezeli, mérete a lap méretétől függ (x86-os gépeken 4 kB). Ilyeneket csak a fő végrehajtható definiálhat, DLL-ek nem, mivel nem inicializálhatók, amikor a LoadLibrary betölti őket.

Pthreads-implementáció

A Pthreads API-ban a szálra lokális memóriára mint szálspecifikus adatokra hivatkoznak.

Szálspecifikus adatok kulcsát létrehozni a pthread_key_create függvénnyel, törölni a pthread_key_delete függvénnyel lehet. Ezután a kulcs pthread_key_t néven tárolódik, ezt a többi szál is látja. A kulcshoz a specifikus adatot a pthread_setspecific társítja. Az adatokat később a pthread_getspecific függvény éri el.

A pthread_key_create elfogad destruktort paraméterként, ez meghívódik a szál kilépésekor, ha az adat nem NULL. A destruktor paraméterként megkapja a kulcs által hivatkozott objektumot, ezért azt el tudja takarítani, a hálózati kapcsolatokat lezárni és az erőforrásokat elengedni. A program kilépéskor meghívja a pthread_key_delete függvényt, ami folyamat szinten felszabadít mindent.

Unix rendszereken nem a Pthreads az egyetlen API, ami meg tudja osztani a memóriát. Egy régebbi, de még mindig érvényes szabvány a MIT-SHM. Maga a pthreads is számos inkompatibilis változáson van túl, a Linux libc már nem használja a /lib/tls/libs használatát, továbbá a pthreads már nem "tls", és több helyen is eltér annak szabványától. Például Linux rendszereken a gas(1) és ld(1) folyamatosan módosították a pthreads implementációját fordítási időben. A tls fontos a libc hatékonysága szempontjából, amikor többszálú alkalmazásokat linkel össze. Viszont használata nem ajánlott a kód gyors avulása miatt, és mivel nem operációs rendszer könyvtár.

Nyelvspecifikus megoldások

Különböző programozási nyelvek további támogatást nyújtanak a szálspecifikus tárolóhoz.

C és C++

2011 előtt a C és a C++ nyelvekben nem volt további lehetőség beépítve, az operációs rendszer API-ját és más programkönyvtárakat lehetett használni, például a Boost szálkezelését.

C11-ben a szállokális változók a _Thread_local kulcsszóval definiálhatók. A <threads.h> szinonimaként bevezeti a thread_local kulcsszót, ha támogatva van. Példa:

#include <threads.h>
thread_local int foo = 0;

A C++11 a thread_local kulcsszót vezeti be,[2] ami a következő esetekben használható:

  • Névtér szintű (globális) változók
  • Fájl szintű statikus változók
  • Függvény szintű statikus változók
  • Statikus tagváltozók

Különböző fordítók specifikus módszereket nyújtanak a szállokális változók definiálásához:

A Vista és a Server 2008 előtti Windowsokban a __declspec(thread) csak akkor működött DLL-ekben, ha azok végrehajthatókhoz voltak kötve, a LoadLibrary() által betöltötteknél nem. Védelmi hiba vagy adatvesztés előfordulhat.[10]

Common Lisp

A Common Lisp (esetleg más Lisp dialektusok) lehetővé teszik dinamikus hatókörű változók definiálását. Ezeknek privát kapcsolatuk, kötésük van egy függvényhez. Ez az absztrakció természetszerűleg szálspecifikus tárolóra képeződik le, és a Lisp szálak alkalmasak is arra, hogy ezt felhasználják.

A Common Lispnek számos standard dinamikus változója van. A nyelv egy implementációjának nem szabad ezeket figyelmen kívül hagynia. Szállokális szemantikával kell ezeket megvalósítani.

Például a *print-base* standard változó meghatározza az alapértelmezett számrendszert (tulajdonképpen az alapot), amiben az egészeket ki lehet írni. Ha ezt felülírják, akkor minden kód ebben a számrendszerben fog kiírni.

;;; function foo and its children will print
;; in hexadecimal:
(let ((*print-base* 16)) (foo))

Ha a függvényeket a konkurrens szálak párhuzamosan hívják, ennek a kötésnek valóban szállokálisnak kell lennie, különben a szálaknak várniuk kell egymásra, hogy megszerezzék az alapot.

D

A D 2. verziójában a static és a globális változók alapértelmezetten szállokálisak. Deklarációjuk megegyezik más nyelvek normál static és globális váltóinak deklarációjával. Globális változók a shared kulcsszóval deklarálhatók.

int threadLocal;  // This is a thread-local variable.
shared int global;  // This is a global variable shared with all threads.

Ez tárolási osztályként is működik, a shared változóknak különféle korlátozásokat kell betartani, amelyek statikusan biztosítják az adat integritást.[11] Klasszikus globális változók a __gshared kulcsszóval deklarálhatók:[12]

__gshared int global;  // This is a plain old global variable.

Java

Java nyelven a szállokális változókat a ThreadLocal osztályobjektum valósítja meg. Ez generikus, az általa tárolt objektum vagy érték get/set metódusokkal érhető el. Például, ha a ThreadLocal Integer objektumot kezel:

private static final ThreadLocal<Integer> myThreadLocalInteger = new ThreadLocal<Integer>();

Az Oracle/OpenJDK nem a natív szállokális tárat használja, habár más tekintetben az operációs rendszer szálaira hagyatkozik. Ehelyett a Thread objektumok tárolnak egy nem szálbiztos megfeleltetést a ThreadLocal objektumok és a bennük tárolt érték között.[13]

.NET nyelvek

A .NET keretrendszerben az osztályobjektumok megjelölhetők a ThreadStatic attributummal:[14]

class FooBar {
   [ThreadStatic] static int foo;
}

A .NET 4.0 rendszerben a System.Threading.ThreadLocal<T> elérhető szállokális változók allokálására és lusta betöltésére:[15]

class FooBar {
   private static System.Threading.ThreadLocal<int> foo;
}

Továbbá elérhető egy API a szállokális változók dinamikus allokálásához.[16]

Object Pascal

Az Object Pascal (Delphi) vagy a Free Pascal nyelvekben a threadvar fenntartott kulcsszóval szállokális változók definiálhatók.

var
   mydata_process: integer;
threadvar
   mydata_threadlocal: integer;

Objective-C

A Cocoa, GNUstep, és OpenStep API-kban minden NSThread objektumnak van szállokális könyvtára, ami hozzáférhető a szál threadDictionary metódusával.

NSMutableDictionary *dict = [[NSThread currentThread] threadDictionary];
dict[@"A key"] = @"Some data";

Perl

A Perl nyelvhez utólag adták hozzá a szálakat, amikor a Comprehensive Perl Archive Network (CPAN) már bőven tartalmazott kódot. A szálak alapértelmezetten szállokális változókat használnak, így minimalizálják a szálak hatását a nem szálbiztosnak készült kódra. Ha megosztott változó kell, azt attributummal kell ellátni:

use threads;
use threads::shared;

my $localvar;
my $sharedvar :shared;

Python

Python 2.4-től a threading modul local osztálya használható szállokális tároló létrehozására.

import threading
mydata = threading.local()
mydata.x = 1

Ruby

Rubyban szállokális változók a []=/[] metódusokkal hozhatók létre és férhetők hozzá.

Thread.current[:user_id] = 1

Jegyzetek

  1. Thread Local Storage (Windows) (angol nyelven). msdn.microsoft.com. (Hozzáférés: 2017. december 12.)
  2. Section 3.7.2 in C++11 standard
  3. IBM XL C/C++: Thread-local storage
  4. GCC 3.3.1: Thread-Local Storage
  5. Clang 2.0: release notes
  6. Intel C++ Compiler 8.1 (linux) release notes: Thread-local Storage
  7. Visual Studio 2003:
  8. Thread extended storage-class modifier
  9. Intel C++ Compiler 10.0 (windows): Thread-local storage
  10. "Rules and Limitations for TLS"
  11. Alexandrescu, Andrei: Chapter 13 - Concurrency. The D Programming Language pp. 3. InformIT, 2010. július 6. (Hozzáférés: 2014. január 3.)
  12. Bright, Walter: Migrating to Shared. dlang.org, 2009. május 12. (Hozzáférés: 2014. január 3.)
  13. How is Java's ThreadLocal implemented under the hood?. Stack Overflow . Stack Exchange. (Hozzáférés: 2015. december 27.)
  14. ThreadStatic attribute
  15. System.Threading.ThreadLocal<T>
  16. an API

Fordítás

Ez a szócikk részben vagy egészben a Thread-local storage című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Read other articles:

Town in Tasmania, AustraliaSaltwater RiverTasmaniaSaltwater RiverCoordinates43°01′07″S 147°42′27″E / 43.0186°S 147.7074°E / -43.0186; 147.7074Population123 (2016 census)[1]Postcode(s)7186Location14 km (9 mi) N of NubeenaLGA(s)TasmanRegionSouth-eastState electorate(s)LyonsFederal division(s)Lyons Localities around Saltwater River: Sloping Main Sloping Main Norfolk Bay Sloping Main Saltwater River Norfolk Bay, Premaydena Nubeena Nubeen...

 

Light rail system in the Dallas-Fort Worth Metroplex This article is about the light rail system in Dallas, Texas. For other uses, see Dart (disambiguation). Not to be confused with Dallas Streetcar. Dallas Area Rapid Transit Light RailDART Blue Line train at Akard station in downtown Dallas heading towards Downtown Rowlett stationOverviewOwnerDARTLocaleDallas, TexasTransit typeLight railNumber of lines4Line number Blue Line Red Line Green Line Orange Line Number of stations65Daily ridership7...

 

American actor (1941–2021) For the Australian rugby league player, see Tommy Kirk (rugby league). Tommy KirkKirk on the set of Son of FlubberBornThomas Lee Kirk(1941-12-10)December 10, 1941Louisville, Kentucky, U.S.DiedSeptember 28, 2021(2021-09-28) (aged 79) (date body found)Las Vegas, Nevada, U.S.OccupationActorYears active1953–1975, 1987-2001Known forThe Shaggy DogSwiss Family RobinsonThe Absent-Minded ProfessorOld YellerParent(s)Louis and Lucy Kirk Thomas Lee Kirk (Dece...

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

 

Untuk penerus klub Persebam Babakan Madang, lihat Depok City FC. PersebamNama lengkapPersatuan Sepak Bola Babakan MadangJulukanMaung BabakanBerdiri2014; 10 tahun lalu (2014)Dibubarkan18 November 2020; 3 tahun lalu (2020-11-18)[1]StadionStadion Persikabo Cibinong, Jawa BaratKetua UmumDelif Subeki (2020)ManajerArio Danu (2020)LigaLiga 3 Persebam (singkatan dari Persatuan Sepakbola Babakan Madang; dikenal juga sebagai Persebam Bogor) adalah klub sepak bola yang berasal dari Kab...

 

Auto UnionIndustriOtomotif, Balap mobilNasibdibeli oleh Volkswagen,sekarang menjadi AudiPenerusAudi AGDidirikan29 Juni 1932Ditutup1 Januari 1965KantorpusatChemnitz, JermanProdukMobil Auto Union adalah gabungan empat produsen mobil Jerman, didirikan pada tahun 1932 di Zwickau, Sachsen selama Depresi Besar. Perusahaan ini berubah menjadi Audi sebagai tambahan indenpenden dari Volkswagen Group (Volkswagen Aktiengesellschaft) (VWAG). Auto Union terkenal untuk tim balapannya, yang merupa...

Dommartin-DampierrecomuneDommartin-Dampierre – Veduta LocalizzazioneStato Francia RegioneGrand Est Dipartimento Marna ArrondissementSainte-Menehould CantoneArgonne Suippe et Vesle TerritorioCoordinate49°04′24″N 4°49′39″E / 49.073333°N 4.8275°E49.073333; 4.8275 (Dommartin-Dampierre)Coordinate: 49°04′24″N 4°49′39″E / 49.073333°N 4.8275°E49.073333; 4.8275 (Dommartin-Dampierre) Altitudine153 m s.l.m. Superficie8,64...

 

2020年夏季奥林匹克运动会波兰代表團波兰国旗IOC編碼POLNOC波蘭奧林匹克委員會網站olimpijski.pl(英文)(波兰文)2020年夏季奥林匹克运动会(東京)2021年7月23日至8月8日(受2019冠状病毒病疫情影响推迟,但仍保留原定名称)運動員206參賽項目24个大项旗手开幕式:帕维尔·科热尼奥夫斯基(游泳)和马娅·沃什乔夫斯卡(自行车)[1]闭幕式:卡罗利娜·纳亚(皮划艇)&#...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Februari 2023. Amitav AcharyaAmitav Acharya di Washington, D.C.Lahir1962Jagatsinghpur, Orissa (sekarang Odisha), IndiaLatar belakang akademisAlma materUniversitas RavenshawUniversitas Jawaharlal NehruUniversitas MurdochKarya akademisMinat utamaHubungan luar negeri, ...

Perbandingan hubungan kekerabatan pada beberapa budaya Hubungan kekerabatan atau kekeluargaan merupakan hubungan antara tiap entitas yang memiliki asal usul silsilah yang sama, baik melalui keturunan biologis,[1] sosial,[2] maupun budaya. Dalam antropologi, sistem kekerabatan termasuk keturunan dan pernikahan, sementara dalam biologi istilah ini termasuk keturunan dan perkawinan. Hubungan kekerabatan manusia melalui pernikahan umum disebut sebagai hubungan dekat ketimbang ketu...

 

Airport serving Penang, Malaysia Penang International AirportLapangan Terbang Antarabangsa Pulau PinangIATA: PENICAO: WMKPWMO: 48601SummaryAirport typePublicOwner/OperatorMalaysia AirportsServesGeorge Town ConurbationLocationBayan Lepas, George Town, Penang, MalaysiaOpened1935; 89 years ago (1935)Hub forFireflyOperating base forAirAsiaTime zoneMST (UTC+08:00)Elevation AMSL11 ft / 3 mCoordinates05°17′49.7″N 100°16′36.71″E / 5.297139°N...

 

Indian philosopher and reformer (1131–1196) JagajyotiBasavaPersonalBorn1131[1]Basavana Bagewadi, Kalyani Chalukya Empire now in Vijayapura district, Karnataka, IndiaDied1196[1] (aged 64–65)Kudalasangama, Hoysala Kingdom now in Bagalkote district, Karnataka, IndiaReligionLingayatSectLingayat (Sharana)[2][3]Known forSocio-religious reforms, Anubhava Mantapa, Vachana literature, Women empowerment movement in South India, Founder of LingayatismSenior posti...

Lower house of the National legislature of Bolivia Chamber of Deputies Cámara de DiputadosTypeTypeLower house of the Plurinational Legislative Assembly HistoryFounded1831LeadershipPresident of the Chamber of DeputiesIsrael Huaytari, MAS since 8 November 2023 StructureSeats130Political groupsGovernment (75)   MAS-IPSP (75) Opposition (55)   Civic Community (39)   Creemos (16) ElectionsVoting systemMixed-member proportional representationLast election18 October 2020Meeting p...

 

فيزياء الجوامدصنف فرعي من فيزياء جزء من فيزياء الموضوع صلب تعديل - تعديل مصدري - تعديل ويكي بيانات فيزياء الجوامد أو فيزياء الحالة الصلبة (بالإنجليزية: Solid-state physics)‏ هو أكبر فروع علم فيزياء المواد المكثفة.[1][2][3] وهو علم يهتم بدراسة المواد الجامدة، والمواد الصلبة...

 

البطولات الوطنية الأمريكية 1938 رقم الفعالية 58  البلد الولايات المتحدة  التاريخ 1938  الرياضة كرة المضرب  البطولات الوطنية الأمريكية 1937  البطولات الوطنية الأمريكية 1939  تعديل مصدري - تعديل   يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير ه�...

Talgo, S.A.JenisSociedad AnónimaKode emitenBMAD: TLGOIndustriPerkeretaapianDidirikan1942KantorpusatLas Rozas de Madrid, Spain[1]ProdukLokomotifKereta cepatKereta antarkotaKereta komuterKaryawan1.100 (Spanyol)Situs webtalgo.com Talgo (resminya bernama Patentes Talgo, SAU) adalah sebuah produsen kereta cepat dan kereta antarkota asal Spanyol. Sejarah TALGO adalah singkatan dari Tren Articulado Ligero Goicoechea Oriol. Perusahaan ini dinamai sesuai nama pendirinya, yakni Alejandro ...

 

MuscleVues macroscopiques et microscopiques du muscle squelettique.DétailsSystème Système musculaireIdentifiantsNom latin Musculi, musculusMeSH D009132TA2 1975, 1994FMA 30316, 5022modifier - modifier le code - modifier Wikidata Le muscle est un organe composé de tissu mou retrouvé chez les animaux. Il est composé de tissus musculaires et de tissus conjonctifs (+ vaisseaux sanguins + nerfs). Les cellules musculaires (composant le tissu musculaire) contiennent des filaments protéiques d'...

 

For the process which uses heat and white thermo paper, see thermal printing. Part of a series on theHistory of printing TechniquesWoodblock printing200Movable type1040Intaglio (printmaking)1430Printing pressc. 1440Etchingc. 1515Mezzotint1642Relief printing1690Aquatint1772Lithography1796Chromolithography1837Rotary press1843Hectograph1860Offset printing1875Hot metal typesetting1884Mimeograph1885Daisy wheel printing1889Photostat and rectigraph1907Screen printing1911Spirit duplicator...

Carloman II Gisant de Carloman II à la basilique Saint-Denis, France, XIIIe siècle. Titre Roi des Francs(Francie occidentale) 11 avril 879 – 6 décembre 884(5 ans, 7 mois et 25 jours) Avec Louis III (879-882) Couronnement 4 septembre 879 à Ferrières-en-Gâtinais Prédécesseur Louis II Successeur Charles III le Gros Biographie Dynastie Carolingiens Date de naissance vers 867 Date de décès 6 décembre 884 Lieu de décès Lyons-la-Forêt (Fr...

 

Pour les articles homonymes, voir Quadrant. Un quadrant astronomique. Le quadrant (du lat. quadrans, antis « quart ») ou quart de cercle est un ancien instrument de mesure angulaire dont la plage d'utilisation est de 90°, ce qui représente l'étendue d'un quart de cercle, ou quadrant, d'où son nom aujourd'hui[N 1]. À l'origine, cet instrument permettait de mesurer la hauteur d'un objet visé. Il était utilisé en astronomie, géodésie, topographie et navigation (quadrant de...