Partage via


CComMultiThreadModel, classe

CComMultiThreadModel fournit des méthodes thread-safe pour incrémenter et décrémenter la valeur d’une variable.

Syntaxe

class CComMultiThreadModel

Membres

Typedefs publics

Nom Description
CComMultiThreadModel ::AutoCriticalSection References, classe CComAutoCriticalSection.
CComMultiThreadModel ::CriticalSection Références, classe CComCriticalSection.
CComMultiThreadModel ::ThreadModelNoCS Classe References CComMultiThreadModelNoCS.

Méthodes publiques

Nom Description
CComMultiThreadModel ::D ecrement (Statique) Décrémente la valeur de la variable spécifiée de manière thread-safe.
CComMultiThreadModel ::Increment (Statique) Incrémente la valeur de la variable spécifiée de manière thread-safe.

Notes

En règle générale, vous utilisez CComMultiThreadModel l’un des deux typedef noms [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel ou [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. La classe référencée par chacun typedef dépend du modèle de threading utilisé, comme indiqué dans le tableau suivant :

typedef Threading unique Threading d’appartements Threading gratuit
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel lui-même définit trois typedef noms. AutoCriticalSection et CriticalSection les classes de référence qui fournissent des méthodes pour obtenir et libérer la propriété d’une section critique. ThreadModelNoCS references, classe [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Spécifications

En-tête : atlbase.h

CComMultiThreadModel ::AutoCriticalSection

Lors de l’utilisationCComMultiThreadModel, le nom AutoCriticalSection fait référence à la typedef classe CComAutoCriticalSection, qui fournit des méthodes pour obtenir et libérer la propriété d’un objet de section critique.

typedef CComAutoCriticalSection AutoCriticalSection;

Notes

CComSingleThreadModel et CComMultiThreadModelNoCS contiennent également des définitions pour AutoCriticalSection. Le tableau suivant montre la relation entre la classe de modèle de threading et la classe de section critique référencée par AutoCriticalSection:

Classe définie dans Classe référencée
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

En plus de AutoCriticalSection, vous pouvez utiliser le typedef nom CriticalSection. Vous ne devez pas spécifier AutoCriticalSection dans les objets globaux ou les membres de classe statique si vous souhaitez éliminer le code de démarrage CRT.

Exemple

Le code suivant est modélisé après CComObjectRootEx et illustre AutoCriticalSection l’utilisation dans un environnement de 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;

Les tableaux suivants affichent les résultats des InternalAddRef méthodes et Lock des méthodes, en fonction du ThreadModel paramètre de modèle et du modèle de thread utilisé par l’application :

ThreadModel = CComObjectThreadModel

Méthode Thread d’un seul ou d’un appartement Threading gratuit
InternalAddRef L’incrément n’est pas thread-safe. L’incrément est thread-safe.
Lock Ne fait rien ; il n’existe aucune section critique à verrouiller. La section critique est verrouillée.

ThreadModel = CComObjectThreadModel ::ThreadModelNoCS

Méthode Thread d’un seul ou d’un appartement Threading gratuit
InternalAddRef L’incrément n’est pas thread-safe. L’incrément est thread-safe.
Lock Ne fait rien ; il n’existe aucune section critique à verrouiller. Ne fait rien ; il n’existe aucune section critique à verrouiller.

CComMultiThreadModel ::CriticalSection

Lors de l’utilisationCComMultiThreadModel, le nom CriticalSection référence la typedef classe CComCriticalSection, qui fournit des méthodes pour obtenir et libérer la propriété d’un objet de section critique.

typedef CComCriticalSection CriticalSection;

Notes

CComSingleThreadModel et CComMultiThreadModelNoCS contiennent également des définitions pour CriticalSection. Le tableau suivant montre la relation entre la classe de modèle de threading et la classe de section critique référencée par CriticalSection:

Classe définie dans Classe référencée
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

En plus CriticalSectionde , vous pouvez utiliser le typedef nom AutoCriticalSection. Vous ne devez pas spécifier AutoCriticalSection dans les objets globaux ou les membres de classe statique si vous souhaitez éliminer le code de démarrage CRT.

Exemple

Voir CComMultiThreadModel ::AutoCriticalSection.

CComMultiThreadModel ::D ecrement

Cette fonction statique appelle la fonction Win32 InterlockedDecrement, qui décrémente la valeur de la variable pointée par p.

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

Paramètres

p
[in] Pointeur vers la variable à décrémenter.

Valeur de retour

Si le résultat de la décrémentation est 0, Decrement retourne 0. Si le résultat du décrément est différent de zéro, la valeur de retour est également différente de zéro, mais peut ne pas être égale au résultat de la décrémentation.

Notes

InterlockedDecrement empêche plusieurs threads d’utiliser cette variable simultanément.

CComMultiThreadModel ::Increment

Cette fonction statique appelle la fonction Win32 InterlockedIncrement, qui incrémente la valeur de la variable pointée par p.

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

Paramètres

p
[in] Pointeur vers la variable à incrémenter.

Valeur de retour

Si le résultat de l’incrément est 0, Increment retourne 0. Si le résultat de l’incrément est différent de zéro, la valeur de retour est également différente de zéro, mais peut ne pas être égale au résultat de l’incrément.

Notes

InterlockedIncrement empêche plusieurs threads d’utiliser cette variable simultanément.

CComMultiThreadModel ::ThreadModelNoCS

Lors de l’utilisationCComMultiThreadModel, le nom ThreadModelNoCS fait référence à la typedef classe CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Notes

CComMultiThreadModelNoCS fournit des méthodes thread-safe pour incrémenter et décrémenter une variable ; toutefois, elle ne fournit pas de section critique.

CComSingleThreadModel et CComMultiThreadModelNoCS contient également des définitions pour ThreadModelNoCS. Le tableau suivant montre la relation entre la classe de modèle de threading et la classe référencée par ThreadModelNoCS:

Classe définie dans Classe référencée
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Exemple

Voir CComMultiThreadModel ::AutoCriticalSection.

Voir aussi

CComSingleThreadModel, classe
CComAutoCriticalSection, classe
CComCriticalSection, classe
Vue d’ensemble de la classe