|
@@ -0,0 +1,37 @@
|
|
|
|
+##Понятие потока
|
|
|
|
+
|
|
|
|
+#Поток (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
|