A menet a menet, hogy

Az előző fejezetben azt a kérdést vetette fel a szálak, úgy, hogy részletesen.

Csakúgy, mint a multitasking operációs rendszer számos dolgot tehetnek egyidejűleg különböző folyamatok, az egyik folyamat nem sok mindent, néhány szál. Mindegyik izzószál függetlenül végrehajtó vezérlő áramlási programjával számláló, a nyilvántartás és kontextusból verem. A fogalmak folyamat és a menet igen szorosan kapcsolódó, és ezért ritkán megkülönböztethető, még szálak gyakran könnyű folyamat. A fő különbség a folyamatot menet abban a tényben rejlik, hogy minden folyamat saját független a többi memóriát, a tábla a nyitott fájlok, aktuális könyvtárban és egyéb információk kernel. A téma nem kapcsolódik közvetlenül ezeket a szervezeteket. Minden szál tartozó eljárás a fent felsorolt ​​valamennyi általános, mivel ebbe a folyamatba. Ezen túlmenően, a folyamat mindig a kernel szintű szervezet, azaz a kernel ismeri a létezését, míg a fonalat gyakran felhasználói szintű szervezetek és a mag nem tud róla semmit. Az ilyen megvalósítási módok, mind a menet adatait tárolja a felhasználói területen, és ezért az ilyen eljárások okoznak, vagy a váltás a fonalak nem igényel hozzáférést a sejtmagba, és hogy egy nagyságrenddel kevesebb idő alatt.

Készítsen szálak és az ideológia posix api

Ha egy alacsony szintű megközelítés szál támogatás a nyelv valamennyi kapcsolódó műveletek kifejezését tekintve függvény hívások. Ennek megfelelően most, hogy megvan egy általános képet, amit egy szál, itt az ideje, hogy fontolja meg, milyen módon tudunk létrehozni és kezelni a menet a programjainkon. Hadd emlékeztessem önöket, hogy beszélünk a C nyelvű felület és a támogatási programok szálak megfelelnek a POSIX szabvány. Ennek megfelelően szál jön létre a következő hívás:

int pthread_create (pthread_t * menet, const pthread_attr_t * attR, void * (* Start) (void *), void * arg)

Egyszerű hívás pthread_create [thr, NULL, indul, NULL] létrehoz egy szál, hogy indul fellépni Start írni és thr változó azonosító létrehozott szál. Egy példa erre a felhívásra, megbeszéljük néhány kiegészítő fogalmak POSIX API, hogy ne lakjanak őket tovább.

Az első érv a funkció szál - egy mutató a változó típusú pthread_t, amelyben az azonosítóját létrehozott szál lesz írva, amely később átvihető más kihívásokat, ha azt akarjuk, hogy valamit tenni ezzel a menettel. Itt állunk szemben első szempontja POSIX API, azaz a fedettség a bázis típusok. Az a tény, hogy szinte el sem lehet mondani semmit, hogy milyen típusú pthread_t. Nem tudjuk, hogy ez az egész, vagy egy mutatót? Vajon elrendelő értékei között ez a típus nem létezik mondani, hogy van, hogy lehetséges-e, hogy létrejöjjön egy lánc közülük nem csökken. Az egyetlen dolog említett szabvány az, hogy ezeket az értékeket lehet másolni, és hogy egy hívás, hogy int pthread_equal [pthread_t thr1, pthread_t Thr2] tudunk létrehozni mind identitás thr1 és Thr2 azonosítani azonos menet [ebben az esetben lehet, hogy egyenlőtlen az értelemben, hogy az egyenlőség operátor]. Ezek a tulajdonságok a legtöbb típusú használt szabvány, sőt, inkább még értékeit ilyen típusú nem lehet másolni!

A második érv az ezt a funkciót attr - egy mutatót egy változó típusú pthread_attr_t, amely meghatározza egy sor néhány fonal tulajdonságait a termelt. Itt állunk szemben egy második jellemzője a POSIX API, azaz a koncepció attribútumokat. A tény az, hogy ezt az API minden esetben, amikor létrehozza vagy az objektum alaphelyzetbe kell határozni egy sor más a tulajdonságainak, megadása helyett ez a készlet segítségével a paraméterkészlet hivatkoznak az átviteli pre-épített objektum, amely az attribútumok. Ez a megoldás legalább két előnye. Először is, meg tudjuk javítani egy sor paramétert, hogy a funkció veszélye nélkül a jövőben változni, amikor ezt a tárgyat már új tulajdonságokkal. Másodsorban, meg tudjuk újra ugyanazokat a tulajdonságokat, hogy hozzon létre egy sor tárgyak.

A harmadik argumentum pthread_create hívás egy mutató függvényében típusú void * () [void *]. Ez az a funkció, és elkezdi végrehajtani az újonnan létrehozott szál, ugyanabban az időben, mint a paraméter a funkció telt négy érvet a pthread_create hívást. Így lehetséges egy kézzel paraméterezni a kód által létrehozott szál, amelyben végre fog hajtani, másrészt paraméterezni különböző továbbított adatok kódot.

pthread_create függvény értéke nulla siker és nullától hibakód hiba. Ez is az egyik jellemzője a POSIX API, ahelyett, hogy a szokásos Unix megközelítés, ha a függvény értéke csak egy kis fény hiba és a hibakód beállítja a változó ERRNO pthreads API függvények hibakódot jelenít eredményeként érvelését. Nyilvánvaló, hogy ez annak a ténynek köszönhető, hogy az Advent a program több szálon ami a különböző függvény egy hibakódot ugyanazon globális változó hibakod, ott van a teljes káosz, azaz, nincs garancia arra, hogy a hibakód, hogy most, ebben a változó az eredmény a hívás történt e, és nem egy másik szál. Bár, mert a hatalmas számos funkció már használja errno könyvtár szálak, és egy példányát errno minden szálat, hogy fel lehetne használni a könyvtárban menet elvileg, de a standard készítői által helyesebb és ami a legfontosabb a módszer gyorsabb, amelyben az API függvények csak vissza hibakódok.

Kapcsolódó cikkek