Classe CComMultiThreadModel

CComMultiThreadModel fornisce metodi thread-safe per incrementare e decrementare il valore di una variabile.

Sintassi

class CComMultiThreadModel

Membri

Typedef pubblici

Nome Descrizione
CComMultiThreadModel::AutoCriticalSection Classe References CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection Classe References CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS Classe References CComMultiThreadModelNoCS.

Metodi pubblici

Nome Descrizione
CComMultiThreadModel::D ecrement (Statico) Decrementa il valore della variabile specificata in modo thread-safe.
CComMultiThreadModel::Increment (Statico) Incrementa il valore della variabile specificata in modo thread-safe.

Osservazioni:

In genere, si usa CComMultiThreadModel tramite uno dei due typedef nomi [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel o [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. La classe a cui fa riferimento ognuno typedef dipende dal modello di threading usato, come illustrato nella tabella seguente:

typedef Threading singolo Threading apartment Threading libero
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel definisce tre typedef nomi. AutoCriticalSection e CriticalSection classi di riferimento che forniscono metodi per ottenere e rilasciare la proprietà di una sezione critica. ThreadModelNoCS classe references [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Requisiti

Intestazione: atlbase.h

CComMultiThreadModel::AutoCriticalSection

Quando si usa CComMultiThreadModel, il typedef nome AutoCriticalSection fa riferimento alla classe CComAutoCriticalSection, che fornisce metodi per ottenere e rilasciare la proprietà di un oggetto sezione critico.

typedef CComAutoCriticalSection AutoCriticalSection;

Osservazioni:

CComSingleThreadModel e CComMultiThreadModelNoCS contengono anche definizioni per AutoCriticalSection. La tabella seguente illustra la relazione tra la classe del modello di threading e la classe di sezione critica a cui fa AutoCriticalSectionriferimento :

Classe definita in Classe a cui si fa riferimento
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Oltre a AutoCriticalSection, è possibile usare il typedef nome CriticalSection. Se si desidera eliminare il codice di avvio CRT, non è consigliabile specificare AutoCriticalSection in oggetti globali o membri di classi statiche.

Esempio

Il codice seguente viene modellato dopo CComObjectRootEx e dimostra l'uso AutoCriticalSection in un ambiente di 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;

Le tabelle seguenti mostrano i risultati dei InternalAddRef metodi e Lock , a seconda del ThreadModel parametro del modello e del modello di threading usato dall'applicazione:

ThreadModel = CComObjectThreadModel

metodo Threading singolo o apartment Threading libero
InternalAddRef L'incremento non è thread-safe. L'incremento è thread-safe.
Lock Non fa nulla; non esiste alcuna sezione critica da bloccare. La sezione critica è bloccata.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

metodo Threading singolo o apartment Threading libero
InternalAddRef L'incremento non è thread-safe. L'incremento è thread-safe.
Lock Non fa nulla; non esiste alcuna sezione critica da bloccare. Non fa nulla; non esiste alcuna sezione critica da bloccare.

CComMultiThreadModel::CriticalSection

Quando si usa CComMultiThreadModel, il typedef nome CriticalSection fa riferimento alla classe CComCriticalSection, che fornisce metodi per ottenere e rilasciare la proprietà di un oggetto sezione critica.

typedef CComCriticalSection CriticalSection;

Osservazioni:

CComSingleThreadModel e CComMultiThreadModelNoCS contengono anche definizioni per CriticalSection. La tabella seguente illustra la relazione tra la classe del modello di threading e la classe di sezione critica a cui fa CriticalSectionriferimento :

Classe definita in Classe a cui si fa riferimento
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Oltre a CriticalSection, è possibile usare il typedef nome AutoCriticalSection. Se si desidera eliminare il codice di avvio CRT, non è consigliabile specificare AutoCriticalSection in oggetti globali o membri di classi statiche.

Esempio

Vedere CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::D ecrement

Questa funzione statica chiama la funzione Win32 InterlockedDecrement, che decrementa il valore della variabile a cui punta p.

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

Parametri

p
[in] Puntatore alla variabile da decrementare.

Valore restituito

Se il risultato del decremento è 0, Decrement restituisce 0. Se il risultato del decremento è diverso da zero, anche il valore restituito è diverso da zero, ma potrebbe non essere uguale al risultato del decremento.

Osservazioni:

InterlockedDecrement impedisce a più thread di usare contemporaneamente questa variabile.

CComMultiThreadModel::Increment

Questa funzione statica chiama la funzione Win32 InterlockedIncrement, che incrementa il valore della variabile a cui punta p.

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

Parametri

p
[in] Puntatore alla variabile da incrementare.

Valore restituito

Se il risultato dell'incremento è 0, Increment restituisce 0. Se il risultato dell'incremento è diverso da zero, anche il valore restituito è diverso da zero, ma potrebbe non essere uguale al risultato dell'incremento.

Osservazioni:

InterlockedIncrement impedisce a più thread di usare contemporaneamente questa variabile.

CComMultiThreadModel::ThreadModelNoCS

Quando si usa CComMultiThreadModel, il typedef nome ThreadModelNoCS fa riferimento alla classe CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Osservazioni:

CComMultiThreadModelNoCS fornisce metodi thread-safe per incrementare e decrementare una variabile; tuttavia, non fornisce una sezione critica.

CComSingleThreadModel e CComMultiThreadModelNoCS contengono anche definizioni per ThreadModelNoCS. La tabella seguente illustra la relazione tra la classe del modello di threading e la classe a cui fa ThreadModelNoCSriferimento :

Classe definita in Classe a cui si fa riferimento
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Esempio

Vedere CComMultiThreadModel::AutoCriticalSection.

Vedi anche

Classe CComSingleThreadModel
Classe CComAutoCriticalSection
Classe CComCriticalSection
Cenni preliminari sulla classe