pthread
POSIX Threads або pthreads — стандарт POSIX реалізації потоків виконання, який визначає API для створення та управління ними.
Бібліотеки, які реалізують цей стандарт та його функції, звичайно називаються pthreads. Найширше використовуються у Unix-подібних операційних системах, як от Linux чи Solaris, також існує реалізація для Microsoft Windows (Pthreads-w32).
Pthreads визначає набір типів даних, функцій і констант в форматі мови програмування C. Вони описані в файлі заголовку pthread.h і реалізовані у вигляді бібліотеки.
Всі процедури Pthreads мають назви з префіксом pthread_
і можуть бути розділені на 4 категорії за призначенням:
- Управляння потоками — створення, об'єднання потоків та ін.;
- М'ютекси;
- Умовні змінні;
- Синхронізація потоків з використанням блокування (lock) і бар'єрів (barriers) читання/запису даних.
POSIX API для семафорів працює з потоками POSIX, але не є частиною стандарту роботи з потоками, визначається в додатковому стандарті POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993). Всі процедури для роботи з семафорами, відповідно, мають префікс sem_
замість pthread_
.
- Типи даних:
pthread_t
: дескриптор потокуpthread_attr_t
: набір атрибутів потоку
- Функції управління потоками:
pthread_create()
: створення потокуpthread_exit()
: завершення потокуpthread_cancel()
: відміна потокуpthread_join()
: блокування потоку до завершення іншого потоку, вказаного у виклику функціїpthread_detach()
: звільнити ресурси зайняті потоком (якщо потік виконується, звільнення ресурсів відбудеться після його завершення)pthread_attr_init()
: ініціалізація структури атрибутів потокуpthread_attr_setdetachstate()
: вказівка системі, що вона після завершення потоку може звільнити ресурси, зайняті потокомpthread_attr_destroy()
: звільнення пам'яті від структури атрибутів потоку (знищити дескриптор)
- Функції синхронізації потоків:
pthread_mutex_init()
,pthread_mutex_destroy()
,pthread_mutex_lock()
,pthread_mutex_trylock()
,pthread_mutex_unlock()
: за допомогою м'ютексівpthread_cond_init()
,pthread_cond_signal()
,pthread_cond_wait()
: за допомогою умовних змінних
Приклад використання 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;
}
- The Open Group Base Specifications Issue 6, IEEE Std 1003.1 [Архівовано 21 лютого 2004 у Wayback Machine.]
- POSIX-потоки та синхронні обробники [Архівовано 18 грудня 2008 у Wayback Machine.] {
- Багатопоточне програмування (Підручник Pthreads) [Архівовано 29 січня 2009 у Wayback Machine.]
- Приклади використання Pthreads [Архівовано 28 вересня 2006 у Wayback Machine.]
- Приклади використання Pthreads в C/C++ [Архівовано 9 травня 2008 у Wayback Machine.]
- Статья «Пояснюючи потоки POSIX [Архівовано 3 серпня 2008 у Wayback Machine.]», Даніеля Роббінса (засновника проекту Gentoo)
- Інтерв'ю «10 питань Девіду Бутенхофу про паралельне програмування та потоки POSIX [Архівовано 28 червня 2008 у Wayback Machine.]» з Майклом Суіссом
- GNU Portable threads [Архівовано 12 липня 2008 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |