Объекты синхронизации
Объекты синхронизации определены в файле tool_mutex.h.
Блокировки
По умолчанию ядро использует классы блокировок, реализованные на основе системных механизмов синхронизации, что позволяет безопасно использовать любые механизмы распараллеливания (в том числе отличные от OpenMP) в пользовательском приложении.
Но ядро может быть переключено на использование блокировок на базе блокировок OpenMP.
На платформе Windows системные блокировки по умолчанию реализуются на базе критической секции. На платформе Linux системные блокировки реализуются на базе pthread_mutex_t.
Реализация классов блокировок управляется переменной C3D_NATIVE_LOCK. Переопределять переменную C3D_NATIVE_LOCK в пользовательском приложении запрещено.
Классы CommonMutex и CommonRecursiveMutex определяют блокировку и рекурсивную блокировку. Они реализуют методы lock() и unlock().
Классы ScopedLock и ScopedRecursiveLock определяют блокировку и рекурсивную блокировку в области видимости. Они могут принимать нулевой указатель на мьютекс. Блокировка происходит, если указатель на мьютекс ненулевой и код выполняется параллельно.
Базовые объекты синхронизации
Класс MbSyncItem – базовый объект синхронизации с отложенной инициализацией, реализующий методы Lock() и Unlock(). Создает блокировку (мьютекс) при необходимости.
Класс MbNestSyncItem – базовый объект синхронизации с отложенной инициализацией, поддерживающий множественные блокировки. Создает блокировку (мьютекс) при необходимости. Реализует методы Lock() и Unlock().
Класс MbPersistentSyncItem – базовый объект синхронизации, реализующий методы Lock() и Unlock(). Всегда создает блокировку.
Класс MbPersistentNestSyncItem – базовый объект синхронизации, поддерживающий множественные блокировки. Всегда создает блокировку. Реализует методы Lock() и Unlock().
Объекты ядра, которым нужны средства синхронизации, являются наследниками одного из этих классов.