POSIX Threads або pthreads — стандарт POSIX реалізації потоків виконання, який визначає API для створення та управління ними.
Бібліотеки, які реалізують цей стандарт та його функції, звичайно називаються pthreads. Найширше використовуються у Unix-подібних операційних системах, як от Linux чи Solaris, також існує реалізація для Microsoft Windows (Pthreads-w32).
Вміст Pthreads визначає набір типів даних, функцій і констант в форматі мови програмування C. Вони описані в файлі заголовку pthread.h і реалізовані у вигляді бібліотеки.
Всі процедури Pthreads мають назви з префіксом і можуть бути розділені на 4 категорії за призначенням:
Управляння потоками — створення, об'єднання потоків та ін.; М'ютекси; Умовні змінні; Синхронізація потоків з використанням блокування (lock) і бар'єрів (barriers) читання/запису даних.
POSIX API для семафорів працює з потоками POSIX, але не є частиною стандарту роботи з потоками, визначається в додатковому стандарті POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993). Всі процедури для роботи з семафорами, відповідно, мають префікс замість .
Основні функції стандарту
Типи даних: : дескриптор потоку : набір атрибутів потоку Функції управління потоками: : створення потоку : завершення потоку : відміна потоку : блокування потоку до завершення іншого потоку, вказаного у виклику функції : звільнити ресурси зайняті потоком (якщо потік виконується, звільнення ресурсів відбудеться після його завершення) : ініціалізація структури атрибутів потоку : вказівка системі, що вона після завершення потоку може звільнити ресурси, зайняті потоком : звільнення пам'яті від структури атрибутів потоку (знищити дескриптор) Функції синхронізації потоків: , , , , : за допомогою м'ютексів , , : за допомогою умовних змінних
Приклад
Приклад використання POSIX потоків.
#include <stdio.h> #include <stdlib.h> #include <pthread.h>
#define THREADS_MAX 4
void *function(void *param) { int id = (int)param; int i, loops = 10; for(i = 0; i < loops; i++)
printf("thread %d: loop %d\n", id, i);
pthread_exit(NULL); }
int main(void) { pthread_t threads[THREADS_MAX]; int i; printf("pre-execution\n"); for (i = 0; i < THREADS_MAX; i++)
pthread_create(&threads[i], NULL, function, (void *)i);
printf("mid-execution\n");
for (i = 0; i < THREADS_MAX; i++)
pthread_join(threads[i], NULL);
printf("post-execution\n"); return EXIT_SUCCESS; }
Дивись також Нить OpenMP Native POSIX Thread Library (NPTL) GNU Portable Threads
Посилання The Open Group Base Specifications Issue 6, IEEE Std 1003.1 POSIX-потоки та синхронні обробники { Багатопоточне програмування (Підручник Pthreads) Приклади використання Pthreads Приклади використання Pthreads в C/C++ Статья «Пояснюючи потоки POSIX », Даніеля Роббінса (засновника проекту Gentoo) Інтерв'ю «10 питань Девіду Бутенхофу про паралельне програмування та потоки POSIX » з Майклом Суіссом GNU Portable threads