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) для вызывающего потока исполнения. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить базовый адрес и размер стека потока исполнения. Параметры
Возвращаемые значения Указатель на стек потока исполнения. |
|
Назначение Гарантирует, что заданная функция будет вызвана только один раз. Параметры
Возвращаемые значения В случае успеха возвращает |