Kérdés:
C ++ 11 szálkészlet megvalósítása
wilx
2014-08-26 17:50:25 UTC
view on stackexchange narkive permalink

Szálkészlet-megvalósítást keresek C ++ 11-es menetes létesítmények alapján. A könyvtár lehetőleg csak fejléc legyen. A licencnek BSD vagy MIT stílusú megengedő típusú licencnek kell lennie, azaz nincs GPL.

Négy válaszokat:
Dylan Corriveau
2015-05-15 22:02:32 UTC
view on stackexchange narkive permalink

Úgy tűnik, van egy GitHub, aki egy kis könyvtárat fejlesztett ki a C ++ 11 számára.

Ez is csak egy központi fejlécfájl (nincs hozzáadható cpp fájl), és illeszkedik a licenc követelményeihez (valójában megengedő ingyenes szoftverlicencet használ)

einpoklum
2016-03-21 03:10:27 UTC
view on stackexchange narkive permalink

Észrevettem, hogy ezt a kérdést alapvetően ugyanazt akarom feltenni, kivéve, hogy már néhányat észrevettem, és nem csupán felsorolásként szeretnék megfelelő ajánlást / áttekintést kapni az erősségekről és gyengeségekről. De egyelőre itt van a felsorolásom:

  • CTPL - Korlátlan, csak fejlécű könyvtár; két változata van: az egyik csak a szabványos könyvtárra támaszkodik, a másik a Boost zár nélküli soros megvalósítását használja. ~ 250 soros vonal ebben az időben.
  • threadpool11 Tolga Hoşgör - "Gyors, zármentes, több platformon átívelő, teljes CPU, amely a szálkészlet megvalósítását használja a C ++ 11 használatával. jellemzők." azt állítja, hogy valamilyen benchmarkon felülmúlja az OpenMP-t; legalábbis azt jelenti, hogy a szerző büszke és magabiztos amellett, hogy nem csak oda rakja ki ... ~ 590 sor, de ez sokkal több kazán licenccel stb. Tehát valószínűleg valami 500 sor.
  • thread_pool Tyler Hardin - Egyosztályú, 1 .hpp + 1 .cpp, könyvtár (a .cpp-be beillesztendő kód megválasztása nagyon ésszerű, tehát ez nem gyengeség a CTPL). ~ 290 sor
  • Boost.ASIO alapú 30 soros threadpool implementáció...

Most nincs felhasználta ezek egyikét, és nem tudja leírni a köztük lévő különbségeket, de nagyon szeretné, ha valaki, aki rendelkezik a szálkészletek használatával, ezt megtenné (külön válaszként).

Szóval, ezt láttam a github hivatkozói listámon. A könyvtáram kissé megváltozott. Még mindig használható egy fejlécként, egy forrás lib-ként, de van kooperatív szálak is, amelyeknek prioritási sora van a POSIX-on. Ez nagyon hasznos rekurzív problémák megoldásához egy szálkészlettel. Hozam nélkül lehetetlen elkerülni a blokkolást, miközben az alszámítás eredményére várunk.
Ja, és szintén nem kompatibilis a C ++ 11-gyel. Az utolsó C ++ 11 és 14 kompatibilis verziókat azonban a readme dokumentálja, így egy kis git kompetenciával lehetséges megszerezni és használni őket.
@Tyler: Akkor tudná szerkeszteni a válaszomat, hogy tükrözze a könyvtárának állapotát? Alternatív megoldásként tegye közzé saját, hosszabb válaszát, ismertetve könyvtárának erősségeit és gyengeségeit.
Ne feledje, hogy ez a 30 sor a Boost.ASIO megvalósításáról nem összehasonlítható (összehasonlításképpen), mivel más Boost szolgáltatásokat használ, például: „boost :: asio :: io_service :: work“, „boost :: asio :: io_service“, és a `boost :: thread_group`.
@DanielLangr: Szívesen szerkeszti a választ és kibővíti az utolsó felsorolást ...
d99kris
2017-12-14 20:14:12 UTC
view on stackexchange narkive permalink

ThreadPool

A ThreadPool egy egyszerűen használható fejlécű szálkészlet könyvtár, amely C ++ 11 szálas API-t használ, és nincs GPL .

Daniel Langr
2020-04-24 19:48:23 UTC
view on stackexchange narkive permalink

szálkészlet-megvalósítást keresek a C ++ 11 szálkezelési lehetőségek alapján.

Ez egyfajta általános leírás. Alapvetően legalább kétféle szálkészlet létezik. Először, és sokkal egyszerűbbek, lehetővé teszi néhány funkció (objektum) által ábrázolt feladat (feladat) lehívását, és ezeket a feladatokat futó szálakhoz rendelheti, amelyek futtatják ezeket a funkciókat mindaddig, amíg be nem fejezik . Ha nem tévedek, az összes javasolt megoldás így működik.

Ezen egyszerű megoldások fő hátránya azonban az, hogy nem képesek felfüggeszteni és folytatni a feladatokat . Ez minden, csak nem könnyű, és ezt például az OpenMP vagy a TBB biztosítja. Tekintsük a legegyszerűbb példát a Fibonacci szám kiszámításához az OpenMP segítségével:

  int Fib (int n) {if (n < 2) return n; int x, y; #pragma omp feladat megosztva (x) x = Fib (n - 1); #pragma omp feladat megosztva (y) y = Fib (n - 2); #pragma omp taskwait return x + y;}  

Ebben az esetben a Fib függvény fel van függesztve a #pragma omp taskwait sorban és a gyermekfeladatok (a feladatban létrehozott feladatok) befejezése után folytatják (opcionálisan akár különböző szálakon is). Ezért szükség van valamilyen mechanizmusra, hogy "kiugorjon" a funkcióból és újra "beugorjon" (a C ++ 20 koroutinjai segítenek?).

Ami a tiszta C ++ -ot illeti, két szálkészlet-megvalósítást találtam, amelyek kissé összetettebbek:

  • cpp-taskflow - úgy tűnik, hogy csak fejléc. Van, amit dinamikus feladat képességnek hívnak, amely a példák szerint új feladatok létrehozását teszi lehetővé a futó feladatokon belül. De nem találom azt a lehetőséget, hogy megvárjam a gyermeki feladatok elvégzését.

  • dougbinks / enkiTS - nem csak a fejléc. Van némi várakozási mechanizmus, de azt gondolom, hogy "blokkol" abban az értelemben, hogy a várakozási feladatokat végrehajtó szál nem egy másik feladat végrehajtása a várakozás során.

Azonban úgy találtam meg ezeket a könyvtárakat, hogy rendszeres feladat oponokat kerestem a modern C ++ rendszerben, és be kell vallanom, hogy nem sokat tudok róluk. Jó lenne, ha bárki további részleteket tudna megadni.



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...