Класс CCriticalSection
Представляет "критически важный раздел" — объект синхронизации, позволяющий одному потоку одновременно получать доступ к ресурсу или разделу кода.
Синтаксис
class CCriticalSection : public CSyncObject
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CCriticalSection::CCriticalSection |
Формирует объект CCriticalSection . |
Открытые методы
Имя | Описание |
---|---|
CCriticalSection::Lock |
Используется для получения доступа к объекту CCriticalSection . |
CCriticalSection::Unlock |
Освобождает объект CCriticalSection . |
Открытые операторы
Имя | Описание |
---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Извлекает указатель на внутренний CRITICAL_SECTION объект. |
Открытые члены данных
Имя | Описание |
---|---|
CCriticalSection::m_sect |
Объект CRITICAL_SECTION . |
Замечания
Критические разделы полезны, если только один поток за раз может изменять данные или другой управляемый ресурс. Например, добавление узлов в связанный список — это процесс, который должен быть разрешен только одним потоком одновременно. С помощью объекта для управления связанным списком CCriticalSection
только один поток за раз может получить доступ к списку.
Примечание.
Функциональные возможности CCriticalSection
класса предоставляются фактическим объектом Win32 CRITICAL_SECTION
.
Критические разделы используются вместо мьютексов (см. ) CMutex
при критической скорости, а ресурс не будет использоваться через границы процесса.
Существует два метода использования CCriticalSection
объекта: автономный и внедренный в класс.
Автономный метод Для использования автономного
CCriticalSection
объекта создайтеCCriticalSection
объект при необходимости. После успешного возврата от конструктора явно заблокируйте объект с вызовомLock
. ВызовитеUnlock
, когда вы закончите доступ к критическому разделу. Этот метод, хотя и более понятный для кого-то, кто читает исходный код, более подвержен ошибке, так как необходимо запомнить, чтобы заблокировать и разблокировать критически важный раздел до и после доступа.Более предпочтительный метод — использовать
CSingleLock
класс. Он также имеетLock
иUnlock
метод, но вам не нужно беспокоиться о разблокировке ресурса, если возникает исключение.Внедренный метод Можно также совместно использовать класс с несколькими потоками, добавив
CCriticalSection
в класс элемент данных типа и заблокируя элемент данных при необходимости.
Дополнительные сведения об использовании CCriticalSection
объектов см. в статье "Многопоточность: использование классов синхронизации".
Иерархия наследования
CCriticalSection
Требования
Заголовок: afxmt.h
CCriticalSection::CCriticalSection
Формирует объект CCriticalSection
.
CCriticalSection();
Замечания
Чтобы получить доступ к объекту CCriticalSection
CSingleLock
или освободить его, создайте объект и Unlock
вызовите функции-членыLock
. CCriticalSection
Если объект используется автономно, вызовите ее Unlock
функцию-член, чтобы освободить ее.
Если конструктор не выделяет требуемую системную память, исключение памяти (типа CMemoryException
) создается автоматически.
Пример
См. пример для CCriticalSection::Lock.
CCriticalSection::Lock
Вызовите эту функцию-член, чтобы получить доступ к критическому объекту раздела.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Параметры
dwTimeout
Lock
игнорирует это значение параметра.
Возвращаемое значение
Ненулевое значение, если функция была успешной; в противном случае — 0.
Замечания
Lock
— это блокирующий вызов, который не возвращается, пока критически важный объект раздела не будет сигнален (становится доступным).
Если требуется время ожидания, можно использовать CMutex
объект вместо CCriticalSection
объекта.
Если Lock
не удается выделить необходимую системную память, исключение памяти (типа CMemoryException
) создается автоматически.
Пример
В этом примере демонстрируется подход к вложенной критической секции путем управления доступом к общему ресурсу (статическому _strShared
объекту) с помощью общего CCriticalSection
объекта. Функция SomeMethod
демонстрирует безопасное обновление общего ресурса.
//Definition of critical section class
class CMyCritSectClass
{
static CString _strShared; //shared resource
static CCriticalSection _critSect;
public:
CMyCritSectClass(void) {}
~CMyCritSectClass(void) {}
void SomeMethod(void); //locks, modifies, and unlocks shared resource
};
//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;
void CMyCritSectClass::SomeMethod()
{
_critSect.Lock();
if (_strShared == "")
_strShared = "<text>";
_critSect.Unlock();
}
CCriticalSection::m_sect
Содержит критически важный объект раздела, используемый всеми CCriticalSection
методами.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
Извлекает CRITICAL_SECTION
объект.
operator CRITICAL_SECTION*();
Замечания
Вызовите эту функцию, чтобы получить указатель на внутренний CRITICAL_SECTION
объект.
CCriticalSection::Unlock
CCriticalSection
Освобождает объект для использования другим потоком.
BOOL Unlock();
Возвращаемое значение
Ненулевое CCriticalSection
значение, если объект принадлежал потоку и выпуск был успешным; в противном случае — значение 0.
Замечания
CCriticalSection
Если используется автономный объект, Unlock
необходимо вызывать сразу после завершения использования ресурса, управляемого критическим разделом. CSingleLock
Если используется объект, CCriticalSection::Unlock
вызовется функцией-членом объекта Unlock
блокировки.
Пример
Пример см. в примере CCriticalSection::Lock
.