Класс CSingleLock
Класс представляет механизм контроля доступа к определенному ресурсу в многопоточных программах.
Синтаксис
class CSingleLock
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CSingleLock::CSingleLock |
Формирует объект CSingleLock . |
Открытые методы
Имя | Описание |
---|---|
CSingleLock::IsLocked |
Определяет, заблокирован ли объект. |
CSingleLock::Lock |
Ожидание объекта синхронизации. |
CSingleLock::Unlock |
Освобождает объект синхронизации. |
Замечания
CSingleLock
не имеет базового класса.
Чтобы использовать классы CSemaphore
синхронизации , CMutex
CCriticalSection
и CEvent
, необходимо создать CSingleLock
объект или CMultiLock
объект для ожидания и освобождения объекта синхронизации. Используйте CSingleLock
, когда нужно ждать только одного объекта одновременно. Используется CMultiLock
при наличии нескольких объектов, которые можно использовать в определенное время.
Чтобы использовать CSingleLock
объект, вызовите его конструктор внутри функции-члена в классе управляемого ресурса. Затем вызовите функцию-член, IsLocked
чтобы определить, доступен ли ресурс. Если это так, перейдите к оставшейся части функции-члена. Если ресурс недоступен, подождите, пока ресурс будет освобожден или возвращен сбой. После завершения использования ресурса вызовите Unlock
функцию, если CSingleLock
объект будет использоваться повторно или разрешить CSingleLock
уничтожению объекта.
CSingleLock
для объектов требуется наличие объекта, производного от CSyncObject
. Обычно это элемент данных класса управляемого ресурса. Дополнительные сведения об использовании CSingleLock
объектов см. в статье "Многопоточность: использование классов синхронизации".
Иерархия наследования
CSingleLock
Требования
Заголовок: afxmt.h
CSingleLock::CSingleLock
Формирует объект CSingleLock
.
explicit CSingleLock(
CSyncObject* pObject,
BOOL bInitialLock = FALSE);
Параметры
pObject
Указывает на доступ к объекту синхронизации. Не может быть NULL
.
bInitialLock
Указывает, следует ли первоначально пытаться получить доступ к предоставленному объекту.
Замечания
Эта функция обычно вызывается из функции-члена доступа управляемого ресурса.
Пример
// m_CritSection is a data member (of type CCriticalSection)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_CritSection) with
// our CSingleLock object.
CSingleLock singleLock(&m_CritSection);
singleLock.Lock(); // Attempt to lock the shared resource
if (singleLock.IsLocked()) // Resource has been locked
{
//...use the shared resource...
// Now that we are finished,
// unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::IsLocked
Определяет, является ли объект, связанный с CSingleLock
объектом, неназначен (недоступен).
BOOL IsLocked();
Возвращаемое значение
Ненулевое значение, если объект заблокирован; в противном случае — 0.
Пример
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
singleLock.Lock(100); // Wait 100 ms...
// Has the resource been successfully locked?
if (singleLock.IsLocked())
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::Lock
Вызовите эту функцию, чтобы получить доступ к ресурсу, управляемому объектом синхронизации, предоставленным конструктору CSingleLock
.
BOOL Lock(DWORD dwTimeOut = INFINITE);
Параметры
dwTimeOut
Указывает время ожидания доступности объекта синхронизации (сигнал). Если INFINITE
, Lock
подождите, пока объект не будет сигнален перед возвратом.
Возвращаемое значение
Ненулевое значение, если функция была успешной; в противном случае — 0.
Замечания
Если объект синхронизации сигнализирует, возвращается успешно, Lock
а поток теперь владеет объектом. Если объект синхронизации не назначен (недоступен), Lock
ожидает, пока объект синхронизации будет сигнализирован до количества миллисекунда, указанного в параметре dwTimeOut
. Если объект синхронизации не был сигнализирован в указанное время, Lock
возвращает ошибку.
Пример
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
if (singleLock.Lock(100)) // Wait 100 ms...
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::Unlock
Освобождает объект синхронизации, CSingleLock
принадлежащий .
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Параметры
lCount
Количество доступа к выпуску. Должно быть больше 0. Если указанное количество приведет к превышению максимального количества объектов, число не изменяется и функция возвращается FALSE
.
lPrevCount
Указывает на переменную для получения предыдущего количества объекта синхронизации. Если NULL
предыдущее число не возвращается.
Возвращаемое значение
Ненулевое значение, если функция была успешной; в противном случае — 0.
Замечания
Эта функция вызывается деструктором CSingleLock
.
Если вам нужно освободить более одного числа доступа семафора, используйте вторую форму Unlock
и укажите количество доступа к выпуску.
Пример
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
if (singleLock.Lock(100)) // Wait 100 ms...
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}