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


Класс 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 объектов см. в статье "Многопоточность: использование классов синхронизации".

Иерархия наследования

CObject

CSyncObject

CCriticalSection

Требования

Заголовок.afxmt.h

CCriticalSection::CCriticalSection

Формирует объект CCriticalSection.

CCriticalSection();

Замечания

Чтобы получить доступ к объекту CCriticalSectionCSingleLock или освободить его, создайте объект и Unlock вызовите функции-членыLock. CCriticalSection Если объект используется автономно, вызовите ее Unlock функцию-член, чтобы освободить ее.

Если конструктор не выделяет требуемую системную память, исключение памяти (типа CMemoryException) создается автоматически.

Пример

См. пример для CCriticalSection::Lock.

CCriticalSection::Lock

Вызовите эту функцию-член, чтобы получить доступ к критическому объекту раздела.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Параметры

dwTimeoutLock игнорирует это значение параметра.

Возвращаемое значение

Ненулевое значение, если функция была успешной; в противном случае — 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.

См. также

CSyncObject Класса
Диаграмма иерархии
CMutex Класса