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