| 12345678910111213141516171819202122232425262728293031323334353637 |
- ##Понятие потока
- #Поток (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.h>. Первый параметр этой функции представляет собой указатель на переменную типа 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
|