Поделиться через


Класс 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 редко применяется к ситуациям с многоблокировками.

См. также

Диаграмма иерархии