##Понятие потока
#Поток (thread) можно определить как часть процесса, включающая управляющую последовательность команд и использующая системные ресурсы этого процесса.
Существует две основных категории реализации потоков: Пользовательские потоки – потоки, реализуемые через
специальные библиотеки потоков и работающие в пользовательском пространстве.
Потоки уровня ядра – потоки, реализуемые через системные вызовы и работающие в пространстве ядра.
Каждый процесс имеет, как минимум, один поток, при этом самый первый поток, создаваемый при рождении нового процесса, принято называть начальным или главным потоком этого процесса.
Основное отличие процесса от потока заключается в способе использования системных ресурсов. Дочерний процесс практически независим от родительского, для него системой выделяется отдельное адресное пространство, и он на равных правах с родительским процессом «конкурирует» за процессорное время. При этом можно уничтожить родительский процесс, не затронув дочерний, который может выполняться и после завершения родительского процесса.
#Первая подсистема потоков в Linux появилась в 1996 году и называлась LinuxThreads, ее автором является Ксавье Лерой (Xavier Leroy). Разработанная им библиотека LinuxThreads была попыткой организовать поддержку потоков в Linux в то время, когда ядро системы еще не предоставляло никаких специальных механизмов для работы с потоками. Позднее разработку потоков для Linux вели сразу две конкурирующие группы – NGPT (New Generation POSIX Threads) и NPTL (Native POSIX Thread Library). В 2002 году группа NGPT
фактически присоединилась к NPTL и теперь реализация потоков NPTL является стандартом Linux. Подсистема потоков Linux стремится соответствовать требованиям стандартов POSIX, поэтому новые многопоточные приложения Linux должны без проблем компилироваться на новых POSIX-совместимых системах.
##Основные функции для работы с потоками
Для работы с потоками используются следующие основные функции: *pthread_create – создание потока; *pthread_join – блокирование работы вызвавшего функцию процесса или потока в ожидании завершения потока; *pthread_cancel – досрочное завершение потока из другого потока или процесса; *pthread_exit – завершает поток, код завершения передается функции pthread_join. Данная функция подобна функции exit, однако вызов exit в «основном» процессе программы приведет к завершению всей программы.
##Запуск и завершение потока
Потоки создаются функцией pthread_create, имеющей следующую сигнатуру:
int pthread_create (pthread_t* tid, pthread_attr_t* attr,
void*(function)(void), void* arg)
#Данная функция определена в заголовочном файле . Первый параметр этой функции представляет собой указатель на переменную типа pthread_t, которая служит идентификатором создаваемого потока. Второй параметр – указатель на переменную типа pthread_attr_t – используется для установки атрибутов потока. Третьим параметром функции pthread_create должен быть адрес функции потока. Эта функция играет для потока ту же роль, что функция main для главной программы. Четвертый параметр функции pthread_create имеет тип void*. Этот параметр может использоваться для передачи значения в функцию потока. Вскоре после вызова pthread_create функция потока будет запущена на выполнение параллельно с другими потоками программы.
#Функции синхронизации потоков с использованием мьютексов
Для синхронизации потоков с использованием мьютексов используются следующие основные функции: *pthread_mutex_init – инициализирует взаимоисключающую блокировку; *pthread_mutex_destroy – удаляет взаимоисключающую блокировку; *pthread_mutex_lock – устанавливает блокировку. В случае, если блокировка была установлена другим потоком, *текущий поток останавливается до снятия блокировки другим процессом; *pthread_mutex_unlock – снимает блокировку.
Источники 1)https://studfile.net/ 2)https://habr.com/ru