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


Класс CComMultiThreadModel

CComMultiThreadModel предоставляет потокобезопасные методы для увеличения и уменьшения значения переменной.

Синтаксис

class CComMultiThreadModel

Участники

Общедоступные определения типов

Имя Описание
CComMultiThreadModel::AutoCriticalSection Ссылается на класс CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection Ссылается на класс CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS Ссылается на класс CComMultiThreadModelNoCS.

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

Имя Описание
CComMultiThreadModel::D ecrement (статический) Уменьшает значение указанной переменной в потокобезопасном режиме.
CComMultiThreadModel::Increment (статический) Увеличивает значение указанной переменной в потокобезопасном режиме.

Замечания

Как правило, вы используете CComMultiThreadModel одно из двух typedef имен : [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel или [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. Класс, на который ссылается каждый из них typedef , зависит от используемой модели потоков, как показано в следующей таблице:

typedef Однопотоковое Потоки квартир Свободный поток
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel сам определяет три typedef имена. AutoCriticalSection и CriticalSection ссылочные классы, предоставляющие методы для получения и освобождения владения критически важным разделом. ThreadModelNoCS класс references [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Требования

Заголовок: atlbase.h

CComMultiThreadModel::AutoCriticalSection

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

typedef CComAutoCriticalSection AutoCriticalSection;

Замечания

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

Класс, определенный в Класс, на который ссылается
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Кроме того AutoCriticalSection, можно использовать typedef имя CriticalSection. Если вы хотите исключить код запуска CRT, не следует указывать AutoCriticalSection в глобальных объектах или статических элементах класса.

Пример

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

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 Ничего не делает; Критически важный раздел для блокировки отсутствует. Ничего не делает; Критически важный раздел для блокировки отсутствует.

CComMultiThreadModel::CriticalSection

При использовании CComMultiThreadModeltypedef имя CriticalSection ссылается на класс CComCriticalSection, который предоставляет методы для получения и освобождения владения критически важным объектом раздела.

typedef CComCriticalSection CriticalSection;

Замечания

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

Класс, определенный в Класс, на который ссылается
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Кроме того CriticalSection, можно использовать typedef имя AutoCriticalSection. Если вы хотите исключить код запуска CRT, не следует указывать AutoCriticalSection в глобальных объектах или статических элементах класса.

Пример

См. раздел CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::D ecrement

Эта статтическая функция вызывает функцию Win32 InterlockedDecrement, которая уменьшает значение переменной, на которую указывает p.

static ULONG WINAPI Decrement(LPLONG p) throw ();

Параметры

p
[in] Указатель на переменную для уменьшения.

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

Если результат уменьшения равен 0, Decrement возвращается значение 0. Если результат декремента ненулевой, возвращаемое значение также ненулевое, но может не совпадать с результатом декремента.

Замечания

InterlockedDecrement Предотвращает одновременное использование этой переменной нескольких потоков.

CComMultiThreadModel::Increment

Эта статтическая функция вызывает функцию Win32 InterlockedIncrement, которая увеличивает значение переменной, на которую указывает p.

static ULONG WINAPI Increment(LPLONG p) throw ();

Параметры

p
[in] Указатель на переменную для увеличения.

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

Если результат приращения равен 0, Increment возвращается значение 0. Если результат увеличения ненулевого значения, возвращаемое значение также ненулевое, но может не совпадать с результатом увеличения.

Замечания

InterlockedIncrement Предотвращает одновременное использование этой переменной нескольких потоков.

CComMultiThreadModel::ThreadModelNoCS

При использовании CComMultiThreadModeltypedef имя ThreadModelNoCS ссылается на класс CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Замечания

CComMultiThreadModelNoCS предоставляет потокобезопасные методы для увеличения и уменьшения переменной; однако он не предоставляет критически важный раздел.

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

Класс, определенный в Класс, на который ссылается
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Пример

См. раздел CComMultiThreadModel::AutoCriticalSection.

См. также

Класс CComSingleThreadModel
Класс CComAutoCriticalSection
Класс CComCriticalSection
Общие сведения о классе