pthreads

редактировать

Потоки POSIX, широко известные как pthreads, представляют собой модель выполнения, которая существует независимо от языка, а также модель параллельного выполнения. Это позволяет программе управлять несколькими различными потоками работы, которые перекрываются во времени. Каждый рабочий поток называется потоком, и создание и контроль над этими потоками достигается путем выполнения вызовов POSIX Threads API. POSIX Threads - это API, определенный стандартом POSIX.1c, расширениями потоков ( IEEE Std 1003.1c-1995).

Реализации API доступны во многих Unix-подобных POSIX-совместимых операционных системах, таких как FreeBSD, NetBSD, OpenBSD, Linux, macOS, Android, Solaris, Redox и AUTOSAR Adaptive, обычно в комплекте в виде библиотеки libpthread. DR-DOS и Microsoft Windows также существуют реализации: в СФУ / БНА подсистема, которая обеспечивает собственную реализацию ряда POSIX API,, а также в сторонних пакетов, таких как PThreads-w32, который реализует PThreads поверх существующей Windows API,.

СОДЕРЖАНИЕ

  • 1 Содержание
  • 2 Пример
  • 3 потока POSIX для Windows
  • 4 См. Также
  • 5 ссылки
  • 6 Дальнейшее чтение
  • 7 Внешние ссылки

СОДЕРЖАНИЕ

pthreads определяет набор типов, функций и констант языка программирования C. Он реализован с заголовком и библиотекой потоков. pthread.h

Существует около 100 процедур потоков, все с префиксом, pthread_и их можно разделить на четыре группы:

API семафоров POSIX работает с потоками POSIX, но не является частью стандарта потоков, поскольку он определен в стандарте POSIX.1b, Расширения реального времени (IEEE Std 1003.1b-1993). Следовательно, процедуры семафоров имеют префикс sem_вместо pthread_.

Пример

Пример, иллюстрирующий использование pthreads в C:

#include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;assert.hgt; #include lt;pthread.hgt; #include lt;unistd.hgt; #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); return NULL; } 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 lt; NUM_THREADS; i++) {  printf("IN MAIN: Creating thread %d.\n", i);  thread_args[i] = i;  result_code = pthread_create(amp;threads[i], NULL, perform_work, amp;thread_args[i]);  assert(!result_code); }  printf("IN MAIN: All threads are created.\n");  //wait for each thread to complete for (i = 0; i lt; 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; }

Эта программа создает пять потоков, каждый из которых выполняет функцию perform_work, которая выводит уникальный номер этого потока на стандартный вывод. Если бы программист хотел, чтобы потоки взаимодействовали друг с другом, для этого потребовалось бы определить переменную вне области видимости любой из функций, сделав ее глобальной переменной. Эту программу можно скомпилировать с помощью компилятора gcc с помощью следующей команды:

gcc pthreads_demo.c -pthread -o pthreads_demo

Вот один из многих возможных результатов запуска этой программы.

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 для Windows

Windows не поддерживает стандарт pthreads изначально, поэтому проект Pthreads4w стремится предоставить переносимую реализацию оболочки с открытым исходным кодом. Его также можно использовать для переноса программного обеспечения Unix (которое использует потоки pthread) с небольшими изменениями платформы Windows или без них. Pthreads4w версии 3.0.0 или новее, выпущенный под Apache Public License v2.0, совместим с 64-битными или 32-битными системами Windows. Версия 2.11.0, выпущенная под лицензией LGPLv3, также совместима с 64- или 32-разрядными версиями.

Проект Mingw-w64 также содержит реализацию оболочки pthreads, winpthreads, которая пытается использовать больше собственных системных вызовов, чем проект Pthreads4w.

Подсистема среды Interix, доступная в пакете « Службы Windows для UNIX / Подсистема для приложений на базе UNIX», предоставляет собственный порт API pthreads, то есть не отображается на Win32 / Win64 API, а создается непосредственно на интерфейсе системных вызовов операционной системы.

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки

Последняя правка сделана 2023-04-13 09:36:56
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте