Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс
Представляет "критически важный раздел" — объект синхронизации, позволяющий одному потоку одновременно получать доступ к ресурсу или разделу кода.
Синтаксис
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);
Параметры
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.