KasperskyOS Community Edition 1.3

Использование фьютексов (sync.h)

API определен в заголовочном файле sysroot-*-kos/include/coresrv/sync/sync.h из состава KasperskyOS SDK.

API предназначен для работы с фьютексами и используется в коде функций API event.h, mutex.h, rwlock.h, semaphore.h, condvar.h. Фьютекс – низкоуровневый примитив синхронизации, для которого поддерживается две операции: блокировка потока исполнения с его добавлением в связанную с фьютексом очередь заблокированных потоков исполнения и возобновление исполнения потоков из связанной с фьютексом очереди заблокированных потоков исполнения. Фьютекс представляет собой объект ядра связанный с целочисленной переменной в пользовательском пространстве. Объект ядра обеспечивает возможность хранить очередь заблокированных потоков исполнения, связанную с фьютексом. Значение целочисленной переменной в пользовательском пространстве (значение фьютекса) атомарно изменяется синхронизируемыми потоками исполнения, чтобы сигнализировать об изменении состояния разделяемых ресурсов. Например, значение фьютекса может отражать, в каком состоянии находится событие (сигнальном или несигнальном), захвачен или освобожден мьютекс, какое значение имеет счетчик семафора. От значения фьютекса зависит, будет ли заблокирован поток исполнения, который пытается получить доступ к разделяемым ресурсам.

Сведения о функциях API приведены в таблице ниже.

Использование API

Чтобы использовать фьютекс, нужно создать только целочисленную переменную для хранения его значения. Функции API принимают указатель на эту переменную через параметр ftx. Создание и удаление объекта ядра, связанного с этой переменной, выполняется автоматически при использовании функций API.

Функция KnFutexWait() блокирует вызывающий поток исполнения, если значение фьютекса совпадает со значением параметра val. (Значение фьютекса может быть изменено другим потоком исполнения во время выполнения функции.) Поток исполнения блокируется на время mdelay, но исполнение этого потока может быть возобновлено до истечения времени mdelay вызовом функции KnFutexWake() из другого потока исполнения. Функция KnFutexWake() возобновляет исполнение потоков из связанной с фьютексом очереди заблокированных потоков исполнения. Число потоков, исполнение которых возобновляется, ограничено значением параметра nThreads. Возобновление исполнения потоков начинается с начала очереди.

Сведения о функциях API

Функции sync.h

Функция

Сведения о функции

KnFutexWait()

Назначение

Блокирует вызывающий поток исполнения, если значение фьютекса равно ожидаемому.

Параметры

  • [in] ftx – указатель на переменную со значением фьютекса.
  • [in] val – ожидаемое значение фьютекса.
  • [in] mdelay – максимальное время блокировки в миллисекундах или INFINITE_TIMEOUT, чтобы задать неограниченное время блокировки.
  • [out,optional] outDelay – фактическое время блокировки в миллисекундах или RTL_NULL, если эти сведения не требуются.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Если время блокировки потока исполнения истекло, возвращает rcTimeout.

Если значение фьютекса не равно ожидаемому, возвращает rcFutexWouldBlock.

KnFutexWake()

Назначение

Возобновляет исполнение потоков, заблокированных вызовами функции KnFutexWait() с заданным фьютексом.

Параметры

  • [in] ftx – указатель на переменную со значением фьютекса.
  • [in] nThreads – максимальное число потоков, исполнение которых может быть возобновлено.
  • [out,optional] wokenCnt – фактическое число потоков, исполнение которых возобновлено, или RTL_NULL, если эти сведения не требуются.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.