POSIX Threads - POSIX Threads
POSIX , zwykle określane jako pthreads , jest modelem realizacji , który istnieje niezależnie od języka, a także równolegle modelu wykonania. Pozwala to program do kontrolowania wielu różnych przepływów pracy, które pokrywają się w czasie. Każdy przepływ pracy jest określany jako nici oraz tworzenia i kontroli tych przepływów jest osiągane poprzez połączenia do API POSIX Threads. POSIX Nici jest API określone przez normę POSIX.1c, nici przedłużenia ( IEEE Std 1003.1c-1995) .
Implementacje interfejsu API są dostępne na wielu uniksowych POSIX-zgodnymi systemami operacyjnymi, takimi jak FreeBSD , NetBSD , OpenBSD , Linux , MacOS , Android , Solaris , Redox i AUTOSAR adaptacyjnej, zazwyczaj dołączane jako biblioteka libpthread . DR-DOS and Microsoft Windows implementacje istnieć również: w SFU / SUA podsystemu, który zapewnia natywną realizację szeregu POSIX API, a także w innych producentów opakowań, takich jak Pthreads-W32, Który realizuje pthreads na szczycie istniejącej Windows API .
Zawartość
pthreads definiuje zbiór C języka programowania typów , funkcji i stałych. Jest on realizowany w pthread.h
nagłówku i nitki biblioteki .
Istnieje około 100 nici procedury, wszystko z prefiksem pthread_
i można je podzielić na cztery grupy:
- zarządzanie wątek - tworzenie, łączenie wątków itd.
- muteksy
- Stan zmienne
- Synchronizacja między wątków z wykorzystaniem zapisu / odczytu blokad i barier
POSIX semaforów API współpracuje z wątków, ale nie jest częścią wątków standard, które zostały zdefiniowane w (1003.1b-1993 IEEE Std) POSIX.1b, przedłużanie czasu rzeczywistego standardu. W związku z tym, procedury semafor są poprzedzone sem_
zamiast pthread_
.
Przykład
Przykład ilustrujący wykorzystanie pthreads C:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>
#define NUM_THREADS 5
void *perform_work(void *arguments){
int index = *((int *)arguments);
int sleep_time = 1 + rand() % NUM_THREADS;
printf("THREAD %d: Started.\n", index);
printf("THREAD %d: Will be sleeping for %d seconds.\n", index, sleep_time);
sleep(sleep_time);
printf("THREAD %d: Ended.\n", index);
}
int main(void) {
pthread_t threads[NUM_THREADS];
int thread_args[NUM_THREADS];
int i;
int result_code;
//create all threads one by one
for (i = 0; i < NUM_THREADS; i++) {
printf("IN MAIN: Creating thread %d.\n", i);
thread_args[i] = i;
result_code = pthread_create(&threads[i], NULL, perform_work, &thread_args[i]);
assert(!result_code);
}
printf("IN MAIN: All threads are created.\n");
//wait for each thread to complete
for (i = 0; i < NUM_THREADS; i++) {
result_code = pthread_join(threads[i], NULL);
assert(!result_code);
printf("IN MAIN: Thread %d has ended.\n", i);
}
printf("MAIN program has ended.\n");
return 0;
}
Ten program tworzy pięć wątków, każdy wykonywania funkcji perform_work który drukuje unikalny numer tego wątku na standardowe wyjście. Jeśli programista chciał nici do komunikowania się ze sobą, wymagałoby to zdefiniowanie zmiennej poza zakresem dowolnej funkcji, co sprawia, że jest to zmienna globalna . Ten program może być skompilowany przy użyciu gcc kompilatora za pomocą następującego polecenia:
gcc pthreads_demo.c -lpthread -o pthreads_demo
Oto jeden z wielu możliwych wyjść z uruchomieniem tego programu.
IN MAIN: Creating thread 0.
IN MAIN: Creating thread 1.
IN MAIN: Creating thread 2.
IN MAIN: Creating thread 3.
THREAD 0: Started.
IN MAIN: Creating thread 4.
THREAD 3: Started.
THREAD 2: Started.
THREAD 0: Will be sleeping for 3 seconds.
THREAD 1: Started.
THREAD 1: Will be sleeping for 5 seconds.
THREAD 2: Will be sleeping for 4 seconds.
THREAD 4: Started.
THREAD 4: Will be sleeping for 1 seconds.
IN MAIN: All threads are created.
THREAD 3: Will be sleeping for 4 seconds.
THREAD 4: Ended.
THREAD 0: Ended.
IN MAIN: Thread 0 has ended.
THREAD 2: Ended.
THREAD 3: Ended.
THREAD 1: Ended.
IN MAIN: Thread 1 has ended.
IN MAIN: Thread 2 has ended.
IN MAIN: Thread 3 has ended.
IN MAIN: Thread 4 has ended.
MAIN program has ended.
POSIX Threads dla Windows
Windows nie obsługują pthreads standardowy natywnie, dlatego Pthreads-W32 projekt ma na celu dostarczenie przenośnego i open-source otoki realizacji. Może być również stosowany do portu Unix oprogramowania (który używa pthreads ) z małym lub bez modyfikacji na platformę Windows. Z dodatkowymi łatami ostatnia wersja 2.8.0 jest kompatybilny z 64-bitowymi systemami Windows. 2.9.0 mówi się również 64-bitowa kompatybilna.
Projekt MinGW-W64 zawiera również realizację owinięciu z pthreads , winpthreads , który próbuje użyć więcej rodzimych wywołań systemowych niż Pthreads-W32 projektu.
Interix podsystem dostępne w środowisku Windows Services for UNIX / Podsystem aplikacji systemu UNIX pakiet zapewnia natywną port Pthreads API, czyli nie odwzorowywane na Win32 / Win64 API, ale wbudowany bezpośrednio w system operacyjny syscall interfejsu.
Zobacz też
- System Runtime
- OpenMP
- Cilk / Cilk Plus
- Threading Building Blocks (TBB)
- Native POSIX Thread Library (NPTL)
- DCEThreads
- clone (wywołanie systemowe Linux)
- nieprawdziwy budzenia
- pamięć lokalna wątku
- GNU przenośne wątki
- FSU Pthreads
- Grand Central Dispatch (biblioteka wątek Apple)
- Beginthread (podprogram w systemie Windows do tworzenia nowego wątku i Unix wątek)
- Nici państwowe , podejście zdarzeniami do gwintowania
Bibliografia
Dalsza lektura
- David R. Butenhof (1997). Programowanie z wątków . Addison-Wesley. ISBN 978-0-201-63392-4,
- Bradford Nicholsa Dick Buttlar; Jacqueline Proulx Farell (wrzesień 1996). Pthreads Programowanie . O'Reilly & Associates. ISBN 978-1-56592-115-3,
- Charles J. Northrup (25.01.1996). Programowanie z UNIX Nici . John Wiley & Sons. ISBN 978-0-471-13751-1,
- Kay A. Robbins & Steven Robbins (2003). Systemy UNIX Programming . Prentice Hall. ISBN 978-0-13-042411-2,