Sponsor:

Your company here, and a link to your site. Click to find out more.

mt.h - Man Page

Поддержка многозадачности

Synopsis

#include 'bee2/defs.h'

Определения типов

typedef bool_t mt_mtx_t
Мьютекс

Функции

bool_t mtMtxCreate (mt_mtx_t *mtx)
Создание мьютекса
bool_t mtMtxIsValid (const mt_mtx_t *mtx)
Корректный мьютекс?
void mtMtxLock (mt_mtx_t *mtx)
Блокировка мьютекса
void mtMtxUnlock (mt_mtx_t *mtx)
Разблокировка мьютекса
void mtMtxClose (mt_mtx_t *mtx)
Закрытие мьютекса
void mtSleep (u32 ms)
Приостановка потока
bool_t mtCallOnce (size_t *once, void(*fn)())
Вызов один раз
size_t mtAtomicIncr (size_t *ctr)
Атомарный инкремент
size_t mtAtomicDecr (size_t *ctr)
Атомарный декремент
size_t mtAtomicCmpSwap (size_t *ctr, size_t cmp, size_t swap)
Атомарное сравнение с заменой

Подробное описание

Предусловие

Все входные указатели действительны, если не оговорено противное.

Мьютексы

Мьютексы — это объект, который может находиться в одном из двух состояний — 'заблокирован' или 'разблокирован'. Поток блокирует мьютекс с помощью функций mtMtxLock(), mtMtxTryLock() и снимает блокировку с помощью функции mtMtxUnlock(). Заблокировать можно только разблокированный мьютекс. Поэтому вызов mtMtxLock() повлечет приостановку выполнения потока вплоть до разблокировки мьютекса.

С помощью мьютексов можно синхронизировать доступ к общим объектам потоков. Перед досупом к объекту каждый из потоков должен заблокировать мьютекс, а после операции над объектом разблокировать его.

Управление мьютексами реализуется по схемам, заданным в стандарте языка Си ISO/IEC 9899:2011 (см. заголовочный файл threads.h).

Интерфейс мьютексов упрощен по сравнению со стандартом: ошибки при блокировке и разблокировке мьютекса не предполагаются.

Если операционная система не распознана, то мьютексы будут 'положительно пустыми': они всегда будут успешно создаваться, блокироваться и разблокироваться, хотя за этими действиями не будет стоять никакого функционала.

Прим.

В реализации для Windows используются облегченные мьютексы -- так называемые критические секции (critical sections).

Управление потоками

Управление потоками реализуется по схемам, заданным в стандарте языка Си ISO/IEC 9899:2011 (см. заголовочный файл threads.h).

Элементарные атомарные операции

Операции выполняются над счетчиками типа size_t, представленными указателями. Операции атомарны в том смысле, что счетчик защищен от изменения в других потоках вплоть до завершения операции.

Предупреждения

Если указатель на счетчик не выровнен на границу size_t, то поведение функций может быть непредсказуемым.

Функции

size_t mtAtomicCmpSwap (size_t * ctr, size_t cmp, size_t swap)

Счетчик ctr атомарно сравнивается с cmp и, в случае совпадения, устанавливается равным swap.

Возвращает

Первоначальное значение счетчика.

Аргументы

ctr счетчик  
cmp сравниваемое значение  
swap новое значение

size_t mtAtomicDecr (size_t * ctr)

Счетчик ctr атомарно уменьшается на 1.

Прим.

Возможно переполнение (снизу, undeflow).

Возвращает

Новое значение счетчика.

Аргументы

ctr счетчик

size_t mtAtomicIncr (size_t * ctr)

Счетчик ctr атомарно увеличивается на 1.

Прим.

Возможно переполнение (сверху, overflow).

Возвращает

Новое значение счетчика.

Аргументы

ctr счетчик

bool_t mtCallOnce (size_t * once, void(*)() fn)

Функция fn() вызывается в точности один раз даже в ситуации конкурентных запросов на вызов из разных потоков. Для контроля однократности вызова используется триггер once, первоначально нулевой.

Ожидается

Триггер once инициализируется нулем и не меняется за пределами функции.

Возвращает

TRUE, если fn() успешно вызвана в данном или предыдущем обращении к mtCallOnce(), и FALSE в противном случае.

Аргументы

once триггер  
fn функция

void mtMtxClose (mt_mtx_t * mtx)

Мьютекс mtx закрывается.

Предусловие

Мьютекс корректен и не заблокирован.

mtMtxClose() < mtMtxCreate().

Прим.

Закрытие заблокированного мьютекса может привести к непредсказуемым последствиям.

Аргументы

mtx мьютекс

bool_t mtMtxCreate (mt_mtx_t * mtx)

Создается мьютекс mtx.

Возвращает

Признак успеха.

Постусловие

В случае успеха мьютекс корректен.

Аргументы

mtx мьютекс

bool_t mtMtxIsValid (const mt_mtx_t * mtx)

Проверяется корректность мьютекса mtx.

Возвращает

Признак корректности.

Аргументы

mtx мьютекс

void mtMtxLock (mt_mtx_t * mtx)

Мьютекс mtx блокируется.

Предусловие

Мьютекс корректен.

Прим.

Если мьютекс заблокирован в момент вызова, то ожидается снятие блокировки (в другом потоке).

Аргументы

mtx мьютекс

void mtMtxUnlock (mt_mtx_t * mtx)

Мьютекс mtx разблокируется.

Предусловие

mtMtxUnlock() < mtMtxLock().

Мьютекс корректен.

Аргументы

mtx мьютекс

void mtSleep (u32 ms)

Текущий поток приостанавливается на ms миллисекунд.

Прим.

1 секунда = 10^3 миллисекунд = 10^6 микросекунд = 10^9 наносекунд.

Если операционная система не распознана или операционная система не поддерживает многозадачность, то приостановки не будет.

Аргументы

ms число миллисекунд

Автор

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.

Info

Вт 23 Янв 2024 00:00:00 Библиотека Bee2