Библиотека libkos
предоставляет API, позволяющие использовать следующие примитивы синхронизации:
event.h
);mutex.h
);rwlock.h
);semaphore.h
);condvar.h
).Заголовочные файлы находятся в KasperskyOS SDK по пути sysroot-*-kos/include/kos
.
API предназначены для синхронизации потоков исполнения, принадлежащих одному и тому же процессу.
События
Событие – примитив синхронизации, который используется для уведомления одного или нескольких потоков исполнения о выполнении требуемого этим потокам условия. Уведомляемый поток исполнения ожидает, когда событие перейдет из несигнального состояния в сигнальное, а уведомляющий поток исполнения изменяет состояние этого события.
Типовой сценарий использования API для работы с событиями включает следующие шаги:
KosEventInit()
.KosEventWait()
или KosEventWaitTimeout()
(на стороне уведомляемых потоков исполнения).KosEventSet()
и KosEventReset()
(на стороне уведомляющих потоков исполнения).Сведения о функциях API для работы с событиями приведены в таблице ниже.
Функции event.h
Функция |
Сведения о функции |
---|---|
|
Назначение Инициализирует событие. После инициализации событие находится в несигнальном состоянии. Параметры
Возвращаемые значения Нет. |
|
Назначение Устанавливает событие в сигнальное состояние. Параметры
Возвращаемые значения Нет. |
|
Назначение Устанавливает событие в несигнальное состояние. Параметры
Возвращаемые значения Нет. |
|
Назначение Ожидает перехода события из несигнального состояния в сигнальное сколь угодно долго. Параметры
Возвращаемые значения Нет. |
|
Назначение Ожидает перехода события из несигнального состояния в сигнальное не дольше заданного времени. Параметры
Возвращаемые значения В случае успеха возвращает Если время ожидания истекло, возвращает |
Мьютексы
Мьютекс – примитив синхронизации, который обеспечивает взаимоисключающее исполнение критических секций (участков кода, в которых осуществляется обращение к разделяемым между потоками исполнения ресурсам). Один поток захватывает мьютекс и исполняет критическую секцию, а другие потоки, чтобы исполнить критические секции, пытаются захватить этот мьютекс, ожидая его освобождения. Мьютекс может быть освобожден только тем потоком исполнения, которым он захвачен. Можно использовать рекурсивный мьютекс, который может быть захвачен одним потоком исполнения несколько раз.
Типовой сценарий использования API для работы с мьютексами включает следующие шаги:
KosMutexInit()
или KosMutexInitEx()
.KosMutexTryLock()
, KosMutexLock()
или KosMutexLockTimeout()
.KosMutexUnlock()
.Сведения о функциях API для работы с мьютексами приведены в таблице ниже.
Функции mutex.h
Функция |
Сведения о функции |
---|---|
|
Назначение Инициализирует мьютекс, который не является рекурсивным. Параметры
Возвращаемые значения Нет. |
|
Назначение Инициализирует мьютекс. Параметры
Возвращаемые значения Нет. |
|
Назначение Захватывает мьютекс. Если мьютекс уже захвачен, не ожидает его освобождения, а возвращает управление. Параметры
Возвращаемые значения В случае успеха возвращает Если мьютекс уже захвачен, возвращает |
|
Назначение Захватывает мьютекс. Если мьютекс уже захвачен, ожидает его освобождения сколь угодно долго. Параметры
Возвращаемые значения Нет. |
|
Назначение Освобождает мьютекс. Параметры
Возвращаемые значения Нет. |
|
Назначение Захватывает мьютекс. Если мьютекс уже захвачен, ожидает его освобождения не дольше заданного времени. Параметры
Возвращаемые значения В случае успеха возвращает Если время ожидания истекло, возвращает |
Блокировки чтения-записи
Блокировка чтения-записи – примитив синхронизации, который используется, чтобы разрешить доступ к разделяемым между потоками исполнения ресурсам либо на запись для одного потока исполнения, либо на чтение для нескольких потоков исполнения одновременно.
Типовой сценарий использования API для работы с блокировками чтения-записи включает следующие шаги:
KosRWLockInit()
.KosRWLockWrite()
или KosRWLockTryWrite()
) или для чтения (вызовом функции KosRWLockRead()
или KosRWLockTryRead()
).KosRWLockUnlock()
.Сведения о функциях API для работы с блокировками чтения-записи приведены в таблице ниже.
Функции rwlock.h
Функция |
Сведения о функции |
---|---|
|
Назначение Инициализирует блокировку чтения-записи. Параметры
Возвращаемые значения Нет. |
|
Назначение Захватывает блокировку чтения-записи для чтения. Если блокировка чтения-записи уже захвачена для записи, или есть потоки исполнения, ожидающие захвата этой блокировки чтения-записи для записи, то ожидает освобождения этой блокировки чтения-записи от захвата для записи сколь угодно долго. Параметры
Возвращаемые значения Нет. |
|
Назначение Захватывает блокировку чтения-записи для чтения. Если блокировка чтения-записи уже захвачена для записи, или есть потоки исполнения, ожидающие захвата этой блокировки чтения-записи для записи, то не ожидает освобождения этой блокировки чтения-записи от захвата для записи, а возвращает управление. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Захватывает блокировку чтения-записи для записи. Если блокировка чтения-записи уже захвачена для записи или чтения, ожидает освобождения этой блокировки чтения-записи сколь угодно долго. Параметры
Возвращаемые значения Нет. |
|
Назначение Захватывает блокировку чтения-записи для записи. Если блокировка чтения-записи уже захвачена для записи или чтения, не ожидает освобождения этой блокировки чтения-записи, а возвращает управление. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Освобождает блокировку чтения-записи. Параметры
Возвращаемые значения Нет. Дополнительные сведения Если блокировка чтения-записи захвачена для чтения, то эта блокировка чтения-записи остается захваченной для чтения, пока все потоки исполнения, выполняющие чтение, не освободят ее. |
Семафоры
Семафор – примитив синхронизации, основанный на счетчике, значение которого может быть атомарно изменено. Значение счетчика обычно отражает число доступных разделяемых между потоками исполнения ресурсов. Для исполнения критической секции поток ожидает, пока значение счетчика не станет больше нуля. Если значение счетчика больше нуля, то оно уменьшается на единицу, и поток исполняет критическую секцию. После исполнения критической секции поток исполнения сигнализирует семафор, в результате чего значение счетчика увеличивается.
Типовой сценарий использования API для работы с семафорами включает следующие шаги:
KosSemaphoreInit()
.KosSemaphoreWait()
, KosSemaphoreWaitTimeout()
или KosSemaphoreTryWait()
.KosSemaphoreSignal()
или KosSemaphoreSignalN()
.KosSemaphoreDeinit()
.Сведения о функциях API для работы с семафорами приведены в таблице ниже.
Функции semaphore.h
Функция |
Сведения о функции |
---|---|
|
Назначение Инициализирует семафор. Параметры
Возвращаемые значения В случае успеха возвращает Если значение в параметре |
|
Назначение Освобождает ресурсы семафора. Параметры
Возвращаемые значения В случае успеха возвращает Если есть потоки исполнения, ожидающие семафор, возвращает |
|
Назначение Сигнализирует семафор с увеличением счетчика на единицу. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Сигнализирует семафор с увеличением счетчика на заданное число. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Ожидает семафор не дольше заданного времени. Параметры
Возвращаемые значения В случае успеха возвращает Если время ожидания истекло, возвращает |
|
Назначение Ожидает семафор сколь угодно долго. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Ожидает семафор. Если счетчик семафора имеет нулевое значение, не ожидает увеличения счетчика этого семафора, а возвращает управление. Параметры
Возвращаемые значения В случае успеха возвращает Если счетчик семафора имеет нулевое значение, возвращает |
Условные переменные
Условная переменная – примитив синхронизации, который используется для уведомления одного или нескольких потоков исполнения о выполнении требуемого этим потокам условия. Условная переменная используется совместно с мьютексом. Уведомляющий и уведомляемый потоки захватывают мьютекс для исполнения критических секций. Уведомляемый поток при исполнении критической секции проверяет, выполняется ли требуемое ему условие (например, подготовлены ли данные уведомляющим потоком). Если условие выполняется, то уведомляемый поток исполняет критическую секцию и освобождает мьютекс. Если условие не выполняется, то уведомляемый поток блокируется на условной переменной, ожидая выполнения условия. При этом мьютекс автоматически освобождается. Уведомляющий поток при исполнении критической секции проверяет, выполняется ли условие, требуемое уведомляемому потоку. Если условие выполняется, то уведомляющий поток сигнализирует об этом через условную переменную и освобождает мьютекс. Уведомляемый поток, заблокированный в ожидании выполнения требуемого ему условия, возобновляет исполнение критической секции, автоматически захватывая мьютекс. После исполнения критической секции уведомляемый поток освобождает мьютекс.
Типовой сценарий использования API для работы с условными переменными включает следующие шаги:
Чтобы инициализировать условную переменную, нужно вызвать функцию KosCondvarInit()
.
Использование условной переменной и мьютекса на стороне уведомляемых потоков исполнения включает следующие шаги:
KosCondvarWait()
или KosCondvarWaitTimeout()
.После возврата функции KosCondvarWait()
или KosCondvarWaitTimeout()
обычно нужно снова проверить, что условие выполняется, так как другой уведомляемый поток исполнения также получил сигнал и мог сделать условие снова недействительным. (Например, другой поток мог извлечь данные, подготовленные уведомляющим потоком). Для этого нужно использовать следующую конструкцию:
while(<условие>)
<вызов KosCondvarWait() или KosCondvarWaitTimeout()>
Использование условной переменной и мьютекса на стороне уведомляющих потоков исполнения включает следующие шаги:
KosCondvarSignal()
или KosCondvarBroadcast()
.Сведения о функциях API для работы с условными переменными приведены в таблице ниже.
Функции condvar.h
Функция |
Сведения о функции |
---|---|
|
Назначение Инициализирует условную переменную. Параметры
Возвращаемые значения Нет. |
|
Назначение Ожидает выполнения условия не дольше заданного времени. Параметры
Возвращаемые значения В случае успеха возвращает Если время ожидания истекло, возвращает |
|
Назначение Ожидает выполнения условия сколь угодно долго. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Сигнализирует о выполнении условия одному из потоков исполнения, ожидающих выполнения этого условия. Параметры
Возвращаемые значения Нет. |
|
Назначение Сигнализирует о выполнении условия всем потокам исполнения, ожидающим выполнения этого условия. Параметры
Возвращаемые значения Нет. |