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 AutoCriticalSection
riferimento :
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 CriticalSection
riferimento :
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 ThreadModelNoCS
riferimento :
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