Класс CMultiLock
Класс представляет механизм контроля доступа к ресурсам в многопоточных программах.
Синтаксис
class CMultiLock
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CMultiLock::CMultiLock | Формирует объект CMultiLock . |
Открытые методы
Имя | Описание |
---|---|
CMultiLock::IsLocked | Определяет, заблокирован ли определенный объект синхронизации в массиве. |
CMultiLock::Lock | Ожидает массив объектов синхронизации. |
CMultiLock::Unlock | Освобождает все объекты синхронизации, принадлежащие. |
Замечания
CMultiLock
не имеет базового класса.
Чтобы использовать классы синхронизации CSemaphore, CMutex и CEvent, можно создать CMultiLock
объект CSingleLock для ожидания и выпуска объекта синхронизации. Используется CMultiLock
при наличии нескольких объектов, которые можно использовать в определенное время. Используйте CSingleLock
, когда нужно ждать только одного объекта одновременно.
Чтобы использовать CMultiLock
объект, сначала создайте массив объектов синхронизации, которые нужно ожидать. Затем вызовите CMultiLock
конструктор объекта внутри функции-члена в классе управляемого ресурса. Затем вызовите функцию-член блокировки , чтобы определить, доступен ли ресурс (сигнал). Если это так, продолжайте с оставшейся частью функции-члена. Если ресурс недоступен, подождите, пока ресурс не будет освобожден, или по истечении указанного времени. После завершения использования ресурса вызовите функцию Разблокировки , если CMultiLock
объект будет использоваться снова или разрешить уничтожению CMultiLock
объекта.
CMultiLock
объекты наиболее полезны, если поток имеет большое количество CEvent
объектов, на которые он может реагировать. Создайте массив, содержащий все CEvent
указатели и вызов Lock
. Это приведет к тому, что поток будет ждать, пока не будет сигналирован один из событий.
Дополнительные сведения об использовании CMultiLock
объектов см. в статье "Многопоточность: использование классов синхронизации".
Иерархия наследования
CMultiLock
Требования
Заголовок: afxmt.h
CMultiLock::CMultiLock
Формирует объект CMultiLock
.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Параметры
ppObjects
Массив указателей на объекты синхронизации для ожидания. Не может быть NULL.
dwCount
Число объектов в ppObjects. Должно быть больше 0.
bInitialLock
Указывает, следует ли первоначально пытаться получить доступ к любому из предоставленных объектов.
Замечания
Эта функция вызывается после создания массива объектов синхронизации для ожидания. Обычно вызывается из потока, который должен ожидать, пока один из объектов синхронизации станет доступным.
CMultiLock::IsLocked
Определяет, является ли указанный объект незначимым (недоступным).
BOOL IsLocked(DWORD dwItem);
Параметры
dwItem
Индекс в массиве объектов, соответствующих объекту, состояние которого запрашивается.
Возвращаемое значение
Ненулевое значение, если указанный объект заблокирован; в противном случае — 0.
CMultiLock::Lock
Вызовите эту функцию, чтобы получить доступ к одному или нескольким ресурсам, контролируемым объектами синхронизации, предоставленными конструктору CMultiLock
.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
Параметры
dwTimeOut
Указывает время ожидания доступности объекта синхронизации (сигнал). Если ПАРАМЕТР INFINITE, Lock
дождется, пока объект не будет сигнален перед возвратом.
bWaitForAll
Указывает, должны ли все объекты, ожидающие их, одновременно сигнализироваться перед возвратом. Если значение FALSE, Lock
возвращается при сигнале любого из объектов, ожидавших ожидания.
dwWakeMask
Указывает другие условия, которые разрешены прервать ожидание. Полный список доступных параметров этого параметра см. в разделе MsgWaitForMultipleObjects в пакете SDK для Windows.
Возвращаемое значение
Если Lock
ошибка завершается ошибкой, возвращается значение - 1. При успешном выполнении возвращается одно из следующих значений:
Между WAIT_OBJECT_0 и WAIT_OBJECT_0 + (число объектов — 1)
Если bWaitForAll имеет значение TRUE, все объекты сигнализируются (доступны). Если bWaitForAll имеет значение FALSE, возвращаемое значение — WAIT_OBJECT_0 является индексом в массиве объектов объекта, сигналивного (доступно).
WAIT_OBJECT_0 + (количество объектов)
Событие, указанное в dwWakeMask , доступно в очереди входных данных потока.
Между WAIT_ABANDONED_0 и WAIT_ABANDONED_0 + (число объектов — 1)
Если bWaitForAll имеет значение TRUE, все объекты сигнализируются, а по крайней мере один из объектов является заброшенным объектом мьютекса. Если bWaitForAll имеет значение FALSE, возвращаемое значение — WAIT_ABANDONED_0 является индексом в массиве объектов заброшенного объекта мьютекса, удовлетворяющего ожиданию.
WAIT_TIMEOUT
Интервал времени ожидания, указанный в dwTimeOut , истек без успешного ожидания.
Замечания
Если bWaitForAll имеет значение TRUE, Lock
возвращается успешно, как только все объекты синхронизации будут сигнализированы одновременно. Если bWaitForAll имеет значение FALSE, Lock
возвращается сразу после того, как один или несколько объектов синхронизации сигнализирует.
Если Lock
не удается немедленно вернуться, он будет ожидать не больше, чем число миллисекундах, указанное в параметре dwTimeOut перед возвратом. Если dwTimeOut имеет значение INFINITE, не вернется до получения доступа к объекту или условия, Lock
указанного в dwWakeMask . В противном случае, если Lock
удалось получить объект синхронизации, он будет возвращен успешно; если нет, он вернет сбой.
CMultiLock::Unlock
Освобождает объект синхронизации, CMultiLock
принадлежащий .
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Параметры
lCount
Количество ссылок для выпуска. Должно быть больше 0. Если указанная сумма приведет к превышению максимального количества объектов, число не изменяется, а функция возвращает ЗНАЧЕНИЕ FALSE.
lPrevCount
Указывает на переменную, чтобы получить предыдущее число для объекта синхронизации. Если значение NULL, то предыдущее число не возвращается.
Возвращаемое значение
Ненулевое значение, если функция была успешной; в противном случае — 0.
Замечания
Эта функция вызывается деструктором CMultiLock
.
Первая форма пытается разблокировать объект синхронизации Unlock
, управляемый CMultiLock
. Вторая форма Unlock
пытается разблокировать CSemaphore
объекты, CMultiLock
принадлежащие . Если CMultiLock
объект заблокирован не принадлежит CSemaphore
, функция возвращает значение FALSE; в противном случае возвращает значение TRUE. lCount и lpPrevCount точно совпадают с параметрами CSingleLock::Unlock. Вторая форма Unlock
редко применяется к ситуациям с многоблокировками.