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


CComMultiThreadModel::AutoCriticalSection

При использовании CComMultiThreadModel, ссылки AutoCriticalSection имени typedef классифицируют CComAutoCriticalSection, который предоставляет методы для получения объекта и освобождение владение критической секции.

typedef CComAutoCriticalSection AutoCriticalSection;

Заметки

CComSingleThreadModel и CComMultiThreadModelNoCS также содержит определения AutoCriticalSection. Следующая таблица показывает связь между классом потоковой модели и классом критической секции снабженными на AutoCriticalSection:

Класс, определенный внутри

Упоминаемый класс

CComMultiThreadModel

CComCriticalSection

CComSingleThreadModel

CComFakeCriticalSection

CComMultiThreadModelNoCS

CComFakeCriticalSection

В дополнение к AutoCriticalSection, можно использовать имя CriticalSectiontypedef. Не следует определять AutoCriticalSection в глобальных объектов или статических членах класса, если необходимо исключить код запуска CRT.

Пример

Следующий код после CComObjectRootEx моделируется и демонстрируется AutoCriticalSection используемой в threading среде.

template< class ThreadModel >
class CMyAutoCritClass
{
public:
   typedef ThreadModel _ThreadModel;
   typedef typename _ThreadModel::AutoCriticalSection _CritSec;

   CMyAutoCritClass() : m_dwRef(0) {}

   ULONG InternalAddRef()
   {
      return _ThreadModel::Increment(&m_dwRef);
   }
   ULONG InternalRelease()
   {
      return _ThreadModel::Decrement(&m_dwRef);   
   }
   void Lock() { m_critsec.Lock( ); }
   void Unlock() { m_critsec.Unlock(); }

private:
   _CritSec m_critsec;
   LONG m_dwRef;
};

В следующей таблице показаны результаты методов InternalAddRef и Lock, в зависимости от параметров шаблона ThreadModel и потоковой модели, используемых приложением.

ThreadModel = CComObjectThreadModel

Метод

Укажите или потоковая модель Подразделение

Освободите работа с потоками

InternalAddRef

Приращение не является потокобезопасным.

Увеличение потокобезопасным.

Lock

Не выполняет никаких действий. нет критической секции для блокирования.

Критическая секция блокирована.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Метод

Укажите или потоковая модель Подразделение

Освободите работа с потоками

InternalAddRef

Приращение не является потокобезопасным.

Увеличение потокобезопасным.

Lock

Не выполняет никаких действий. нет критической секции для блокирования.

Не выполняет никаких действий. нет критической секции для блокирования.

Требования

Header: atlbase.h

См. также

Ссылки

CComMultiThreadModel Class

CComObjectThreadModel

CComGlobalsThreadModel

CComMultiThreadModel::ThreadModelNoCS