POSIX vlákna - POSIX Threads
POSIX vlákna, obvykle označované jako pthreads, je model provedení který existuje nezávisle na jazyce a také na paralelním modelu provádění. Umožňuje programu ovládat více různých toků práce, které se časově překrývají. Každý pracovní tok se označuje jako a vlákno a vytváření a kontroly nad těmito toky je dosaženo voláním rozhraní POSIX Threads API. POSIX Vlákna je API definovaný normou POSIX.1c, rozšíření vláken (IEEE Standard 1003.1c-1995).
Implementace API jsou k dispozici na mnoha Unixový POSIX vyhovující operační systémy jako např FreeBSD, NetBSD, OpenBSD, Linux, Operační Systém Mac, Android[1], Solaris, Redox, a AUTOSAR Adaptivní, obvykle dodáván jako knihovna libpthread. DR-DOS a Microsoft Windows existují také implementace: v rámci SFU / SUA subsystém, který poskytuje nativní implementaci řady POSIX API, a také uvnitř třetí strana balíčky jako pthreads-w32,[2] který implementuje pthreads nad existující Windows API.
Obsah
pthreads definuje množinu C programovací jazyk typy, funkce a konstanty. Je implementován pomocí a pthread.h
záhlaví a vlákno knihovna.
Existuje přibližně 100 podprocesů, všechny mají předponu pthread_
a lze je rozdělit do čtyř skupin:
- Správa vláken - vytváření, spojování vláken atd.
- Mutexy
- Podmínkové proměnné
- Synchronizace mezi vlákny pomocí zámků pro čtení / zápis a bariér
POSIX semafor API pracuje s vlákny POSIX, ale není součástí standardu vláken, který byl definován v POSIX.1b, rozšíření v reálném čase (IEEE Std 1003.1b-1993) Standard. V důsledku toho jsou semaforové procedury předponou sem_
namísto pthread_
.
Příklad
Příklad ilustrující použití pthreads v C:
#zahrnout <stdio.h>#zahrnout <stdlib.h>#zahrnout <assert.h>#zahrnout <pthread.h>#zahrnout <unistd.h>#define NUM_THREADS 5prázdnota *provést_práce(prázdnota *argumenty){ int index = *((int *)argumenty); int Čas spát = 1 + rand() % NUM_THREADS; printf("ZÁVIT% d: Spuštěno. n", index); printf("ZÁVIT% d: Bude spát% d sekund. n", index, Čas spát); spát(Čas spát); printf("ZÁVIT% d: Ukončeno. n", index); }int hlavní(prázdnota) { pthread_t vlákna[NUM_THREADS]; int thread_args[NUM_THREADS]; int i; int výsledek_kód; // vytvoří všechna vlákna jeden po druhém pro (i = 0; i < NUM_THREADS; i++) { printf("V HLAVNÍM: Vytváření vlákna% d. n", i); thread_args[i] = i; výsledek_kód = pthread_create(&vlákna[i], NULA, provést_práce, &thread_args[i]); tvrdit(!výsledek_kód); } printf("V HLAVNÍM: Všechna vlákna jsou vytvořena. n"); // počkejte na dokončení každého vlákna pro (i = 0; i < NUM_THREADS; i++) { výsledek_kód = pthread_join(vlákna[i], NULA); tvrdit(!výsledek_kód); printf(„V HLAVNÍM: Vlákno% d skončilo. n", i); } printf("HLAVNÍ program skončil. n"); vrátit se 0;}
Tento program vytváří pět vláken, z nichž každý vykonává funkci provést_práce který vytiskne jedinečné číslo tohoto vlákna na standardní výstup. Pokud programátor chtěl, aby vlákna vzájemně komunikovala, vyžadovalo by to definování proměnné mimo rozsah kterékoli z funkcí, což by globální proměnná. Tento program lze sestavit pomocí gcc kompilátor s následujícím příkazem:
gcc pthreads_demo.c -lpthread -o pthreads_demo
Zde je jeden z mnoha možných výstupů z spuštění tohoto programu.
IN MAIN: Vytváření podprocesu 0.IN MAIN: Vytváření podprocesu 1.IN MAIN: Vytváření podprocesu 2.IN MAIN: Vytváření podprocesu 3.THREAD 0: Started.IN MAIN: Vytváření podprocesu 4.THREAD 3: Started.THREAD 2: Started. ZÁVIT 0: Bude spát po dobu 3 sekund. ZÁVIT 1: Spuštěno. ZÁVIT 1: Bude spát po dobu 5 sekund. ZÁVIT 2: Bude spát po dobu 4 sekund. ZÁVIT 4: Spuštěno. ZÁVIT 4: Bude spát po dobu 1 sekundy. V HLAVNÍM: Všechna vlákna jsou vytvořena. ZÁVIT 3: Bude spát po dobu 4 sekund. ZÁVIT 4: Ukončeno. ZÁVIT 0: Ukončeno. .IN MAIN: Vlákno 1 skončilo. IN MAIN: Vlákno 2 skončilo. IN MAIN: Vlákno 3 skončilo. IN MAIN: Vlákno 4 skončilo. HLAVNÍ program skončil.
POSIX vlákna pro Windows
Windows nepodporují pthreads nativně standardní, proto Pthreads-w32 projekt se snaží poskytnout přenosnou a otevřenou implementaci wrapperu. Lze jej také použít k přenosu Unix software (který používá pthreads) s malou nebo žádnou úpravou platformy Windows.[3] S některými dalšími opravami je poslední verze 2.8.0 kompatibilní s 64bitovými systémy Windows.[4][5][6] 2.9.0 je také považován za 64bitový kompatibilní.[7]
Projekt mingw-w64 také obsahuje souhrnnou implementaci pthreads, winpthreads,[8] který se pokouší použít více nativních systémových volání než projekt Pthreads-w32.[9]
Interix subsystém prostředí dostupný v systému Windows Služby Windows pro systém UNIX / Subsystém pro aplikace založené na systému UNIX balíček poskytuje nativní port pthreads API, tj. Není mapováno na Win32 / Win64 API, ale je postaveno přímo na operačním systému Syscall rozhraní.[10]
Viz také
- Runtime systém
- OpenMP
- Cilk /Cilk Plus
- Navlékání stavebních bloků (TBB)
- Nativní knihovna vláken POSIX (NPTL)
- DCEThreads
- klon (systémové volání systému Linux)
- Rušivé probuzení
- Místní úložiště vláken
- Přenosná vlákna GNU
- FSU Pthreads
- Grand Central Dispatch (Knihovna vláken Apple)
- Začátek vlákna (podprogram v systému Windows pro vytvoření nového vlákna a unixového vlákna)
- Státní vlákna, přístup k vláknům řízený událostmi
Reference
- ^ „libc / bionic / pthread.c - platforma / bionic - Git na Google“. android.googlesource.com.
- ^ „Pthread Win-32: Úroveň shody standardů“. 2006-12-22. Citováno 2010-08-29.
- ^ Hart, Johnson M. (2004-11-21). „Experimenty s knihovnou Pthreads s otevřeným zdrojovým kódem a několika komentáři“. Archivovány od originál dne 30. 8. 2010. Citováno 2010-08-29.
- ^ "pthread-win32_x64.zip Zdroj a binární soubor pro pthreads-w32 v2.8.0". 2010-01-26. Citováno 2010-08-29.
- ^ "Diskuse na fóru: pthreads-on-64bit-Windows". 26. 1. 2010. Archivovány od originál dne 15. 12. 2010. Citováno 2010-08-29.
- ^ "Kompilovat pthreads - mingw-w64". sourceforge.net. Archivovány od originál dne 02.07.2012. Citováno 2012-07-26.
- ^ http://sourceware.org/pthreads-win32/news.html - zmiňuje se „64 bit“
- ^ mingw-w64 - Revize 5520: / experimentální / winpthreads[trvalý mrtvý odkaz ]
- ^ vidět http://locklessinc.com/articles/pthreads_on_windows odkud byl původně odvozen
- ^ „Kapitola 1: Úvod do služeb Windows pro UNIX 3.5“.
Další čtení
- David R. Butenhof (1997). Programování pomocí POSIX vláken. Addison-Wesley. ISBN 978-0-201-63392-4.
- Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (září 1996). Programování Pthreads. O'Reilly & Associates. ISBN 978-1-56592-115-3.
- Charles J. Northrup (25.01.1996). Programování pomocí UNIXových vláken. John Wiley & Sons. ISBN 978-0-471-13751-1.
- Kay A. Robbins a Steven Robbins (2003). Programování systémů UNIX. Prentice-Hall. ISBN 978-0-13-042411-2.