Класс 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 | Пн. |
CComGlobalsThreadModel |
S | Пн. | Пн. |
S= CComSingleThreadModel
; M= CComMultiThreadModel
CComMultiThreadModel
сам определяет три typedef
имена. AutoCriticalSection
и CriticalSection
ссылочные классы, предоставляющие методы для получения и освобождения владения критически важным разделом. ThreadModelNoCS
класс references [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).
Требования
Заголовок: atlbase.h
CComMultiThreadModel::AutoCriticalSection
При использовании CComMultiThreadModel
typedef
имя 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
При использовании CComMultiThreadModel
typedef
имя 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
При использовании CComMultiThreadModel
typedef
имя ThreadModelNoCS
ссылается на класс CComMultiThreadModelNoCS.
typedef CComMultiThreadModelNoCS ThreadModelNoCS;
Замечания
CComMultiThreadModelNoCS
предоставляет потокобезопасные методы для увеличения и уменьшения переменной; однако он не предоставляет критически важный раздел.
CComSingleThreadModel и CComMultiThreadModelNoCS
содержит определения для ThreadModelNoCS
. В следующей таблице показана связь между классом модели потоков и классом, ThreadModelNoCS
на который ссылается:
Класс, определенный в | Класс, на который ссылается |
---|---|
CComMultiThreadModel |
CComMultiThreadModelNoCS |
CComSingleThreadModel |
CComSingleThreadModel |
CComMultiThreadModelNoCS |
CComMultiThreadModelNoCS |
Пример
См. раздел CComMultiThreadModel::AutoCriticalSection.
См. также
Класс CComSingleThreadModel
Класс CComAutoCriticalSection
Класс CComCriticalSection
Общие сведения о классе