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


Класс CSingleLock

Класс представляет механизм контроля доступа к определенному ресурсу в многопоточных программах.

Синтаксис

class CSingleLock

Участники

Открытые конструкторы

Имя Описание
CSingleLock::CSingleLock Формирует объект CSingleLock.

Открытые методы

Имя Описание
CSingleLock::IsLocked Определяет, заблокирован ли объект.
CSingleLock::Lock Ожидание объекта синхронизации.
CSingleLock::Unlock Освобождает объект синхронизации.

Замечания

CSingleLock не имеет базового класса.

Чтобы использовать классы CSemaphoreсинхронизации , CMutexCCriticalSectionи 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();
}

См. также

Диаграмма иерархии
CMultiLock Класса