Управление потоками исполнения (высокоуровневый API thread.h)
API определен в заголовочном файле sysroot-*-kos/include/kos/thread.h
из состава KasperskyOS SDK.
Основные возможности API:
- создавать, завершать, блокировать потоки исполнения;
- возобновлять исполнение заблокированных потоков;
- регистрировать функции, вызываемые при создании и завершении потоков исполнения.
Сведения о функциях API приведены в таблице ниже.
Библиотека libkos
также предоставляет низкоуровневый API для управления потоками исполнения, который определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h
из состава KasperskyOS SDK. Низкоуровневый API следует использовать, если только недостаточно возможностей высокоуровневого API.
Создание потоков исполнения
Чтобы создать поток исполнения, нужно вызвать функцию KosThreadCreate()
или KosThreadCreateDetached()
. Эти функции создают стандартный поток исполнения, приоритет которого может принимать значения от 0 до 15. (О стандартных потоках исполнения см. "Управление потоками исполнения (низкоуровневый API thread_api.h)".)
Завершение потоков исполнения
Завершение потока исполнения представляет собой его перманентное удаление из планировщика. Поток исполнения завершается в следующих случаях:
- Осуществлен выход из функции, выполняемой потоком исполнения.
Должен быть осуществлен выход оператором
return
из корневой (не из вложенной) функции, выполняемой потоком исполнения. - Вызвана функция
KosThreadTerminate()
илиKosThreadExit()
.Функция
KosThreadExit()
завершает поток исполнения, даже если вызвана не из корневой функции, выполняемой потоком исполнения, а из вложенной. - Завершился или перешел в "замороженное" состояние процесс.
О "замороженном" состоянии процесса см. "Управление процессами (низкоуровневый API task_api.h)".
Коды завершения потоков исполнения определяются разработчиком решения на базе KasperskyOS. Эти коды нужно указывать в параметре exitCode
функций KosThreadTerminate()
и KosThreadExit()
, а также при вызове оператора return
в функции, выполняемой потоком исполнения. Чтобы получить код завершения потока исполнения, нужно вызвать функцию KosThreadWait()
. В случае успеха эта функция возвращает код завершения потока исполнения, иначе возвращает -1
, поэтому коды завершения потоков исполнения должны быть отличными от -1
, чтобы избежать неоднозначности.
Регистрация функций, вызываемых при создании и завершении потоков исполнения
Чтобы зарегистрировать функцию, вызываемую при создании и завершении потоков процесса, нужно вызвать из этого процесса функцию KosThreadCallbackRegister()
.
Зарегистрированная функция вызывается в следующих случаях:
- при создании потока исполнения вызовом функции
KosThreadCreate()
; - при завершении потока исполнения, созданного вызовом функции
KosThreadCreate()
, в результате выхода из функции, выполняемой этим потоком; - при завершении потока исполнения вызовом функции
KosThreadExit()
.
Можно зарегистрировать несколько функций, и каждая из них будет вызвана при создании и завершении потока исполнения. При создании потока исполнения зарегистрированная функция вызывается с аргументом KosThreadCallbackReasonCreate
в параметре reason
. При завершении потока исполнения зарегистрированная функция вызывается с аргументом KosThreadCallbackReasonDestroy
в параметре reason
.
Гарантирование невозможности вызвать функцию несколько раз
Только при первом вызове функции KosThreadOnce()
вызывается заданная через параметр initRoutine
callback-функция. При повторных вызовах функции KosThreadOnce()
(даже из других потоков исполнения) этого не происходит, и функция KosThreadOnce()
просто возвращает управление. Например, это обеспечивает однократную инициализацию драйвера, в том случае, когда несколько программных компонентов используют этот драйвер и запускают его инициализацию независимо друг от друга.
Особенности потоков исполнения, привязанных к прерываниям
После привязки к прерыванию поток исполнения становится потоком исполнения реального времени с классом планирования FIFO и приоритетом выше 31. (О привязке потока исполнения к прерыванию см. "Управление обработкой прерываний (irq.h)". О классе планирования потоков реального времени FIFO см. "Управление потоками исполнения (низкоуровневый API thread_api.h)".)
Для потоков исполнения, привязанных к прерываниям, нельзя применять многие функции API, в том числе KosThreadCreate()
, KosThreadSuspend()
, KosThreadResume()
, KosThreadTerminate()
, KosThreadWait()
, KosThreadSleep()
, KosThreadYield()
.
Задание и получение базового адреса TLS потоков исполнения
Локальная память потока исполнения (англ. Thread Local Storage, TLS) – это память процесса, где поток исполнения может хранить данные изолированно от других потоков исполнения. Задать и получить базовый адрес TLS позволяют функции KosThreadTlsSet()
и KosThreadTlsGet()
соответственно. Эти функции предназначены для использования библиотекой libc
.
Получение базового адреса и размера стека потоков исполнения
Получить базовый адрес и размер стека потока исполнения позволяет функция KosThreadGetStack()
. Эта функция предназначена для использования библиотекой libc
.
Освобождение ресурсов завершившихся потоков исполнения
Ресурсами потока исполнения являются его стек, контекст и TCB (о TCB см. "Управление потоками исполнения (низкоуровневый API thread_api.h)"). Чтобы ресурсы потока исполнения были освобождены после его завершения, нужно вызвать функцию KosThreadWait()
для ожидания завершения этого потока исполнения. (Исключением являются начальный поток процесса и поток исполнения, созданный функцией KosThreadCreateDetached()
.) Также ресурсы потоков исполнения освобождаются при завершении процесса, в который они входят.
Сведения о функциях API
Функции thread.h
Функция |
Сведения о функции |
---|---|
|
Назначение Регистрирует функцию, вызываемую при создании и завершении потоков исполнения вызывающего процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Дерегистрирует функцию, вызываемую при создании и завершении потоков исполнения вызывающего процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает поток исполнения. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает незаблокированный поток исполнения и закрывает его дескриптор. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить идентификатор (TID) вызывающего потока исполнения. Параметры Нет. Возвращаемые значения Идентификатор потока исполнения. Тип идентификатора определен в заголовочном файле |
|
Назначение Блокирует вызывающий поток исполнения. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Возобновляет исполнение заблокированного потока. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Завершает вызывающий поток исполнения. Параметры
Возвращаемые значения Нет. |
|
Назначение Блокирует вызывающий поток исполнения до завершения заданного потока исполнения. Параметры
Возвращаемые значения В случае успеха возвращает код завершения потока исполнения, иначе возвращает |
|
Назначение Блокирует вызывающий поток исполнения на заданное время. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Отдает квант времени вызывающего потока исполнения следующему в очереди. Параметры Нет. Возвращаемые значения Нет. Дополнительные сведения Вызов функции |
|
Назначение Завершает поток исполнения. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить базовый адрес локальной памяти потока исполнения (TLS) для вызывающего потока исполнения. Параметры Нет. Возвращаемые значения Указатель на TLS или |
|
Назначение Задает базовый адрес локальной памяти потока исполнения (TLS) для вызывающего потока исполнения. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить базовый адрес и размер стека потока исполнения. Параметры
Возвращаемые значения Указатель на стек потока исполнения. |
|
Назначение Гарантирует, что заданная функция будет вызвана только один раз. Параметры
Возвращаемые значения В случае успеха возвращает |