Freigeben über


CComMultiThreadModel-Klasse

CComMultiThreadModel stellt threadsichere Methoden zum Erhöhen und Verringern des Werts einer Variablen bereit.

Syntax

class CComMultiThreadModel

Member

Öffentliche Typedefs

Name Beschreibung
CComMultiThreadModel::AutoCriticalSection References-Klasse CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection References-Klasse CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS References-Klasse CComMultiThreadModelNoCS.

Öffentliche Methoden

Name Beschreibung
CComMultiThreadModel::D ecrement (Statisch) Erhöht den Wert der angegebenen Variablen auf threadsichere Weise.
CComMultiThreadModel::Increment (Statisch) Erhöht den Wert der angegebenen Variablen auf threadsichere Weise.

Hinweise

In der Regel verwenden CComMultiThreadModel Sie einen von zwei typedef Namen, entweder [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel oder [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel). Die klasse, auf die von jedem typedef verwiesen wird, hängt vom verwendeten Threadingmodell ab, wie in der folgenden Tabelle dargestellt:

typedef Single Threading Apartmentthreading Freithreading
CComObjectThreadModel E E M
CComGlobalsThreadModel E M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel selbst definiert drei typedef Namen. AutoCriticalSection und CriticalSection Referenzklassen, die Methoden zum Abrufen und Freigeben des Besitzes eines kritischen Abschnitts bereitstellen. ThreadModelNoCS references class [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Anforderungen

Kopfzeile: atlbase.h

CComMultiThreadModel::AutoCriticalSection

Bei Verwendung CComMultiThreadModelverweist die typedef Namensklasse AutoCriticalSectionCComAutoCriticalSection, die Methoden zum Abrufen und Freigeben des Besitzes eines kritischen Abschnittsobjekts bereitstellt.

typedef CComAutoCriticalSection AutoCriticalSection;

Hinweise

CComSingleThreadModel und CComMultiThreadModelNoCS enthalten auch Definitionen für AutoCriticalSection. Die folgende Tabelle zeigt die Beziehung zwischen der Threadingmodellklasse und der kritischen Abschnittsklasse, auf die verwiesen wird:AutoCriticalSection

Klasse definiert in Auf die Klasse verwiesen wird
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Zusätzlich dazu AutoCriticalSectionkönnen Sie den typedef Namen CriticalSection verwenden. Sie sollten nicht in globalen Objekten oder statischen Klassenmitgliedern angeben AutoCriticalSection , wenn Sie den CRT-Startcode entfernen möchten.

Beispiel

Der folgende Code wird nach CComObjectRootEx modelliert und veranschaulicht AutoCriticalSection die Verwendung in einer Threadingumgebung.

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;

In den folgenden Tabellen sind die Ergebnisse der InternalAddRef Vorlagenparameter und LockThreadModel Methoden sowie das von der Anwendung verwendete Threadingmodell dargestellt:

ThreadModel = CComObjectThreadModel

Methode Single- oder Apartmentthreading Free Threading
InternalAddRef Die Inkrementierung ist nicht threadsicher. Die Inkrementierung ist threadsicher.
Lock Macht nichts; es ist kein kritischer Abschnitt zum Sperren vorhanden. Der kritische Abschnitt ist gesperrt.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Methode Single- oder Apartmentthreading Free Threading
InternalAddRef Die Inkrementierung ist nicht threadsicher. Die Inkrementierung ist threadsicher.
Lock Macht nichts; es ist kein kritischer Abschnitt zum Sperren vorhanden. Macht nichts; es ist kein kritischer Abschnitt zum Sperren vorhanden.

CComMultiThreadModel::CriticalSection

Bei Verwendung CComMultiThreadModelverweist die typedef Namensklasse CriticalSectionCComCriticalSection, die Methoden zum Abrufen und Freigeben des Besitzes eines kritischen Abschnittsobjekts bereitstellt.

typedef CComCriticalSection CriticalSection;

Hinweise

CComSingleThreadModel und CComMultiThreadModelNoCS enthalten auch Definitionen für CriticalSection. Die folgende Tabelle zeigt die Beziehung zwischen der Threadingmodellklasse und der kritischen Abschnittsklasse, auf die verwiesen wird:CriticalSection

Klasse definiert in Auf die Klasse verwiesen wird
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Zusätzlich dazu CriticalSectionkönnen Sie den typedef Namen AutoCriticalSection verwenden. Sie sollten nicht in globalen Objekten oder statischen Klassenmitgliedern angeben AutoCriticalSection , wenn Sie den CRT-Startcode entfernen möchten.

Beispiel

Siehe CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::D ecrement

Diese statische Funktion ruft die Win32-Funktion InterlockedDecrement auf, wodurch der Wert der Variablen verringert wird, auf die von p verwiesen wird.

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

Parameter

p
[in] Zeiger auf die Variable, die dekrementiert werden soll.

Rückgabewert

Wenn das Ergebnis der Dekrementierung 0 ist, wird Decrement 0 zurückgegeben. Wenn das Ergebnis der Dekrementierung ungleich Null ist, ist der Rückgabewert auch nicht gleich dem Ergebnis der Dekrementierung.

Hinweise

InterlockedDecrement verhindert, dass mehr als ein Thread gleichzeitig diese Variable verwendet.

CComMultiThreadModel::Increment

Diese statische Funktion ruft die Win32-Funktion InterlockedIncrement auf, wodurch der Wert der Variablen erhöht wird, auf die von p verwiesen wird.

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

Parameter

p
[in] Zeiger auf die Variable, die erhöht werden soll.

Rückgabewert

Wenn das Ergebnis des Inkrements 0 ist, wird Increment 0 zurückgegeben. Wenn das Ergebnis des Inkrements ungleich Null ist, ist der Rückgabewert auch nicht null, kann aber nicht gleich dem Ergebnis des Inkrements sein.

Hinweise

InterlockedIncrement verhindert, dass mehr als ein Thread gleichzeitig diese Variable verwendet.

CComMultiThreadModel::ThreadModelNoCS

Bei Verwendung CComMultiThreadModelverweist die typedef Namensklasse ThreadModelNoCSCComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Hinweise

CComMultiThreadModelNoCS stellt threadsichere Methoden zum Inkrementieren und Dekrementieren einer Variablen bereit; Es stellt jedoch keinen kritischen Abschnitt bereit.

CComSingleThreadModel und CComMultiThreadModelNoCS enthält auch Definitionen für ThreadModelNoCS. Die folgende Tabelle zeigt die Beziehung zwischen der Threadingmodellklasse und der Klasse, auf die verwiesen wird:ThreadModelNoCS

Klasse definiert in Auf die Klasse verwiesen wird
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Beispiel

Siehe CComMultiThreadModel::AutoCriticalSection.

Siehe auch

CComSingleThreadModel-Klasse
CComAutoCriticalSection-Klasse
CComCriticalSection-Klasse
Klassenübersicht