Mi az a szálmedence?

Hogyan lehetne megvalósítani egy szálkészletet? A wikipédián a “threadpool” -ot olvastam, de még mindig nem tudom kitalálni, mit kell tennie ennek a kérdésnek a megoldása érdekében (valószínűleg azért, mert egyszerűen nem értettem, mi az a szálkészlet).

Tudna valaki magyarázatot adni egyszerű angolul, mi az a szálkészlet és hogyan válaszolna erre a kérdésre?

Válasz

Egy szál A pool egy előre példázott, tétlen szálak csoportja, amelyek készen állnak a munka elvégzésére. Ezeket előnyösebbek az új szálak példányosítására az egyes feladatoknál, ha nagy számú rövid feladatot kell végrehajtani, nem pedig kevés hosszút. Ez megakadályozza, hogy egy szál létrehozása sokszor felmerüljön.

A megvalósítás környezettől függ, de leegyszerűsítve a következőkre van szükség:

  • A szálak létrehozásának és készenléti állapotban tartásának módja. Ez úgy érhető el, hogy minden szálat egy sorompónál várakozunk, amíg a medence átadja a műveletet. is.)
  • Tároló a létrehozott szálak tárolására, például egy várólista vagy bármely más struktúra, amellyel hozzá lehet adni egy szálat a készlethez, és kihúzni egyet.
  • Normál felület vagy absztrakt osztály a szálak számára a munka során. Lehet, hogy ez egy absztrakt osztály, amelyet úgy hívnak: Task, egy execute() módszerrel, amely elvégzi a munkát, majd visszatér.

    A szálkészlet létrehozásakor vagy bizonyos számú szálat példányosít, hogy elérhetővé tegyen, vagy szükség szerint újakat hoz létre, a megvalósítás igényeitől függően.

    Amikor a készlet átadja a Task, kivesz egy szálat a tárolóból (vagy megvárja, amíg elérhető lesz, ha a tároló üres), átad egy Task, és megfelel a korlátnak. Ez a tétlen szál folytatja a végrehajtást, a execute() metódus meghívásával az adott Task számára. Miután a végrehajtás befejeződött, a szál visszajut a medencébe, hogy újból felhasználható legyen a tárolóban, majd megfelel a gátjának, és addig alszik, amíg a ciklus megismétlődik.

    Megjegyzések

    • A szálkészlet előre példázott, tétlen szálak csoportja, amelyek készen állnak a munkára. […] Ez megakadályozza, hogy a szálak sokszor létrehozásával járó többletköltségek merüljenek fel. – ezt a Google-nek köpnie kell, amikor valaki ” szálra keres. pool ”
    • A szálkészlet létrehozása magában foglal-e akadályt? Megoszthatja a hivatkozásokat ezeken a sorokon?
    • @overexchange Nem, nem. Erre a kérdésre való hivatkozásom példaként szolgálhatott arra, hogy akadálykérdését újra megírhatja . (Ha mégis megteszi, írok egy választ.)
    • az egyik legjobb rövid válasz.

Válasz

A szálkészlet a kezelt szálak gyűjteménye, amelyek általában egy sorba vannak rendezve, és amelyek a feladatsorban végrehajtják a feladatokat.

Egy új szálobjektum létrehozása minden alkalommal, amikor valamilyen aszinkron végrehajtásra van szükség, drága. Egy szálkészletben csak hozzá kell adni az aszinkron módon végrehajtandó feladatokat a feladatsorhoz, és a szálkészlet gondoskodik egy elérhető szál hozzárendeléséről, ha van ilyen, a megfelelő feladathoz. Amint a feladat befejeződik, a már elérhető szál újabb feladatot kér (feltételezve, hogy van még hátra).

A szálkészlet segít elkerülni több szál létrehozását vagy megsemmisítését, mint amire valóban szükség lenne.

Kezdeném azzal, hogy létrehozok egy osztályt a szálak és a feladatok sorával. Ezután hajtson végre egy módszert, amely feladatot ad hozzá a feladatsorhoz, és lépjen tovább onnan. Nyilvánvaló, hogy lehetővé kell tennie a maximálisan megengedett szálak beállítását is egy szálkészletben.

Válasz

Valós élet példa;

  1. Létesítmény: Operációs rendszer
  2. Szakaszok: Alkalmazások
  3. Emberek: Szálak

Van egy létesítményed ott 12 ember dolgozik. Ennek a létesítménynek 3 szakasza van. Konyha, mellékhelyiségek és biztonság. Ha nem használja a szálmedence technikát, akkor ez így működik: Mind a 12 ember egy tárgyalóteremben fog állni, ha új ügyfelek jönnek a létesítménybe, és feladatokat kérnek, akkor csoportokba különíti el az embereket és elküldi őket munkájukat, és jöjjenek vissza a tárgyalóba. De mielőtt szolgálatukba lépnének, van egy felkészülési szakasz. Megfelelő egyenruhát kell viselniük, fel kell szerelniük bizonyos eszközöket, be kell járniuk arra a szakaszra, be kell fejezniük a munkát és vissza kell térniük. valahányszor befejezik munkájukat (a szál vége), vissza kell sétálniuk a tárgyalóba, levetkőzni az egyenruhát, elővenni a felszerelést és megvárni a következő munkát. Ezek a szál kontextusának létrehozására, a memória elosztására és az operációs rendszer által követett információkra vonatkoznak.Túl sok időigényes az operációs rendszer számára az új száligények újraszervezése.

Ha szálkészletet használ, akkor kora reggel 6 főt rendel be a konyhába, 2 főt a mellékhelyiségbe és 4 fő a biztonsághoz. Tehát csak naponta egyszer fogják elvégezni a felkészülést. Még akkor is, ha a konyhán nincsenek vásárlók, ez a 4 ember alapjáraton ott lesz minden közelgő feladathoz. A konyha bezárásáig (az alkalmazás vége) nem kell visszamenniük a tárgyalóba. Ez a 4 ember a Kitchen alkalmazás medencéjében van, és készen áll a gyors kiszolgálásra. De nem ígérheti, hogy egész nap dolgoznak, mivel a konyha időről időre tétlenné válhat. Ugyanez a logika érvényes a mellékhelyiségekre és a biztonságra is.

Az első esetben nem pazarolsz semmilyen szálat egyetlen feladathoz sem, de sok időbe telik az egyes szálak előkészítése az egyes feladatokhoz. A másodikban előre elkészíti a szálakat, így nem garantálhatja, hogy minden szálat minden feladatra használni fog, de az operációs rendszer többnyire nagyszerű optimalizálást hajt végre, így nyugodtan támaszkodhat rá.

Válasz

Többszálú alkalmazásban a szálkészlet egy “elérhető szálak halmaza”, amelyet az alkalmazás használhat. Általában pl. .NET, az egészet úgy kezelik, hogy csak feladatokat rendel hozzá, és ha egy szál szabad lesz, akkor végre fogja hajtani. Tehát egy szálkészlet megvalósításához elvárnék egy olyan koncepció létrehozását, ahol a feladatokat automatikusan ingyenes szálak veszik át, anélkül, hogy az egyes feladatokhoz külön szál létrehozása lenne.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük