12-10-2023
POSIX Threads — стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.
Библиотеки, реализующие этот стандарт (и функции этого стандарта), обычно называются Pthreads (функции имеют приставку «pthread_»). Хотя наиболее известны варианты для Unix-подобных операционных систем, таких как Linux или Solaris, но существует и реализация для Microsoft Windows (Pthreads-w32)
Содержание |
Pthreads определяет набор типов и функций на языке программирования Си. Заголовочный файл — pthread.h.
Пример использования потоков на языке C:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> static void wait_thread(void) { time_t start_time = time(NULL); while (time(NULL) == start_time) { /* do nothing except chew CPU slices for up to one second. */ } } static void *thread_func(void *vptr_args) { int i; for (i = 0; i < 20; i++) { fputs(" b\n", stderr); wait_thread(); } return NULL; } int main(void) { int i; pthread_t thread; if (pthread_create(&thread, NULL, thread_func, NULL) != 0) { return EXIT_FAILURE; } for (i = 0; i < 20; i++) { puts("a"); wait_thread(); } if (pthread_join(thread, NULL) != 0) { return EXIT_FAILURE; } return EXIT_SUCCESS; }
Пример использования потоков на языке C++:
#include <cstdlib> #include <iostream> #include <memory> #include <pthread.h> class Thread { private: pthread_t thread; Thread(const Thread& copy); // copy constructor denied static void *thread_func(void *d) { ((Thread *)d)->run(); } public: Thread() {} virtual ~Thread() {} virtual void run() = 0; int start() { return pthread_create(&thread, NULL, Thread::thread_func, (void*)this); } int wait () { return pthread_join (thread, NULL); } }; typedef std::auto_ptr<Thread> ThreadPtr; int main(void) { class Thread_a:public Thread { public: void run() { for (int i=0; i<20; i++, sleep(1)) std::cout << "a " << std::endl; } }; class Thread_b:public Thread { public: void run() { for(int i=0; i<20; i++, sleep(1)) std::cout << " b" << std::endl; } }; ThreadPtr a( new Thread_a() ); ThreadPtr b( new Thread_b() ); if (a->start() != 0 || b->start() != 0) return EXIT_FAILURE; if (a->wait() != 0 || b->wait() != 0) return EXIT_FAILURE; return EXIT_SUCCESS; }
Представленные программы используют два потока, печатающих в консоль сообщения, один, печатающий 'a', второй — 'b'. Вывод сообщений смешивается в результате переключения выполнения между потоками или одновременном выполнении на мультипроцессорных системах.
Отличие состоит в том, что программа на C создает один новый поток для печати 'b', а основной поток печатает 'a'. Основной поток (после печати 'aaaaa….') ждёт завершения дочернего потока.
Программа на C++ создает два новых потока, один печатает 'a', второй, соответственно, — 'b'. Основной поток ждёт завершения обоих дочерних потоков.
POSIX Threads.