Pthreads je v informační technologii POSIXový standard pro vlákno (thread). Standard, POSIX.1c, Threads rozšíření (IEEE Std 1003.1c-1995), definuje API pro vytváření a manipulaci s vlákny.

Implementace API je možná na mnohých Unix-like operačních systémech podporujících POSIX jako např. FreeBSD, NetBSD, OpenBSD, GNU/Linux (projekt NPTL), Mac OS X, Solaris, DR-DOS a implementace pro Microsoft Windows také existuje za použití podsystému SFU/SUA, který poskytuje nativní implementaci několika POSIX API, popř. také při využití balíčků třetí strany pthreads-w32, který implementuje pthreads na vrcholu stávajících Windows API.

Obsah Pthreads definuje několik datových typů, funkcí a konstant pro programovací jazyk C. K použití vláken v programu je nutné připojit hlavičkový soubor pthread.h . Implementace vláken se nachází v knihovně libpthread.

Existuje něco kolem 100 Pthread procedur, všechny s prefixem "pthread_" a mohou být rozděleny do čtyř skupin:

Manipulace s vlákny – vytváření, spojování, atd. Mutexy Podmínkové proměnné Synchronizace mezi vlákny za použití čtecích/zapisovacích zámků a bariér

POSIXové semaforové API pracuje s POSIX vlákny, ale není částí standardů pro práci s vlákny, které byly definovány ve standardu POSIX.1b, real-time rozšíření (IEEE Std 1003.1b-1993). Proto mají semaforové procedury prefix "sem_" a ne "pthread_".

Příklad Příklad ukazující použití Pthreads v jazyce C:

#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <assert.h>

#define NUM_THREADS 5

void *TaskCode(void *argument) { int tid;

tid = *((int *) argument); printf("Ahoj světe! To jsem já, vlákno %d!\n", tid);

/* Zde je možnost vložit užitečné věci :-) */

return NULL;

int main(void) { pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; int rc, i;

/* vytvoření všech vláken */ for (i=0; i<NUM_THREADS; ++i) { thread_args[i] = i; printf("Ve fci main: vytváření vlákna %d\n", i); rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]); assert(0 == rc);

/* čekání na dokončení všech vláken */ for (i=0; i<NUM_THREADS; ++i) { rc = pthread_join(threads[i], NULL); assert(0 == rc);

exit(EXIT_SUCCESS); }

Tento program vytváří 5 vláken, každé spouští funkci TaskCode, která vypisuje unikátní číslo daného vlákna do standardního výstupu. Pokud programátor chce, aby vlákna mezi sebou komunikovala, vyžadovalo by to definování globální proměnné a ošetření souběhu.

POSIX vlákna pro Windows Windows nativně nepodporuje standard pthreads, proto se projekt Pthreads-w32 snaží poskytnout přenosnou open-source implementaci. S malou nebo žádnou modifikací mohou být také použity Unix programy (které využívají pthreads) do platformy Windows. Poslední verze 2.8.0 je kompatibilní s 64bitovými systémy Windows.

Interix – prostředí dostupné ve Windows Services pro UNIX/Subsystem pro aplikace založené na UNIXu. Balíček poskytuje nativní port pthreads API, tj. nenamapováno na Win32/Win64 API ale vytvořen přímo v operačním systému "syscall" rozhraní.

Odkazy

Reference

Literatura

Související články OpenMP

Externí odkazy Výuka Pthreads Výuka C/C++: používání Pthreads Článek "Vysvětlení POSIX vláken" od Daniela Robbinse (zakladatel Gentoo Linux) Interview "10 otázek pro Davida Butenhofa o paralelním programování a POSIX vlákna" od Michaela Suesse Open Source POSIX vlákna pro Win32 Open Group Base specifikace 6. vydání, IEEE Std 1003.1 Pthreads Presentation at 2007 OSCON (O'Reilly Open Source konvence) od Adriena Lamotha. Přehled pthreads se současnými trendy. Porovnání programovatelnosti Open MP a pthreads

Kategorie:Programování