Udostępnij za pośrednictwem


Klasa CComMultiThreadModel

CComMultiThreadModel Zapewnia bezpieczne wątkowo metody inkrementacji i dekrementacji wartości zmiennej.

Składnia

class CComMultiThreadModel

Elementy członkowskie

Definicje typów publicznych

Nazwa/nazwisko opis
CComMultiThreadModel::AutoCriticalSection Odwołuje się do klasy CComAutoCriticalSection.
CComMultiThreadModel::CriticalSection Odwołuje się do klasy CComCriticalSection.
CComMultiThreadModel::ThreadModelNoCS Odwołuje się do klasy CComMultiThreadModelNoCS.

Metody publiczne

Nazwa/nazwisko opis
CComMultiThreadModel::D ecrement (Statyczne) Dekrementuje wartość określonej zmiennej w bezpieczny wątkowo sposób.
CComMultiThreadModel::Increment (Statyczne) Zwiększa wartość określonej zmiennej w bezpieczny wątkowo sposób.

Uwagi

Zazwyczaj używasz CComMultiThreadModel jednej z dwóch typedef nazw : [CComObjectThreadModel](atl-typedefs.md#ccomobjectthreadmodel lub [CComGlobalsThreadModel](atl-typedefs.md#ccomglobalsthreadmodel. Klasa, do którego odwołuje się każda typedef z nich, zależy od używanego modelu wątkowego, jak pokazano w poniższej tabeli:

— klasa typedef Pojedyncze wątkowanie Wątkowanie apartamentów Wolne wątkowanie
CComObjectThreadModel S S M
CComGlobalsThreadModel S M M

S= CComSingleThreadModel; M= CComMultiThreadModel

CComMultiThreadModel sam definiuje trzy typedef nazwy. AutoCriticalSection i CriticalSection klasy referencyjne, które zapewniają metody uzyskiwania i zwalniania własności sekcji krytycznej. ThreadModelNoCS references, klasa [CComMultiThreadModelNoCS(ccommultithreadmodelnocs-class.md).

Wymagania

Nagłówek: atlbase.h

CComMultiThreadModel::AutoCriticalSection

W przypadku używania metody CComMultiThreadModeltypedef nazwa AutoCriticalSection odwołuje się do klasy CComAutoCriticalSection, która udostępnia metody uzyskiwania i zwalniania własności obiektu sekcji krytycznej.

typedef CComAutoCriticalSection AutoCriticalSection;

Uwagi

CComSingleThreadModel i CComMultiThreadModelNoCS zawierają również definicje dla elementu AutoCriticalSection. W poniższej tabeli przedstawiono relację między klasą modelu wątkowania a klasą sekcji krytycznej przywołyną przez :AutoCriticalSection

Klasa zdefiniowana w Odwołano się do klasy
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Oprócz AutoCriticalSectionfunkcji można użyć typedef nazwy CriticalSection. Nie należy określać AutoCriticalSection w obiektach globalnych lub statycznych składowych klas, jeśli chcesz wyeliminować kod uruchamiania CRT.

Przykład

Poniższy kod jest modelowany po CComObjectRootEx i demonstruje AutoCriticalSection użycie w środowisku wątkowym.

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;

W poniższych tabelach przedstawiono wyniki InternalAddRef metod i Lock w zależności od ThreadModel parametru szablonu i modelu wątkowania używanego przez aplikację:

ThreadModel = CComObjectThreadModel

Method Wątek pojedynczy lub apartamentowy Wolne wątkowanie
InternalAddRef Przyrost nie jest bezpieczny wątkowo. Przyrost jest bezpieczny wątkowo.
Lock Nic nie robi; nie ma sekcji krytycznej do zablokowania. Sekcja krytyczna jest zablokowana.

ThreadModel = CComObjectThreadModel::ThreadModelNoCS

Method Wątek pojedynczy lub apartamentowy Wolne wątkowanie
InternalAddRef Przyrost nie jest bezpieczny wątkowo. Przyrost jest bezpieczny wątkowo.
Lock Nic nie robi; nie ma sekcji krytycznej do zablokowania. Nic nie robi; nie ma sekcji krytycznej do zablokowania.

CComMultiThreadModel::CriticalSection

W przypadku używania CComMultiThreadModelmetody typedef nazwa CriticalSection odwołuje się do klasy CComCriticalSection, która udostępnia metody uzyskiwania i zwalniania własności obiektu sekcji krytycznej.

typedef CComCriticalSection CriticalSection;

Uwagi

CComSingleThreadModel i CComMultiThreadModelNoCS zawierają również definicje dla elementu CriticalSection. W poniższej tabeli przedstawiono relację między klasą modelu wątkowania a klasą sekcji krytycznej przywołyną przez :CriticalSection

Klasa zdefiniowana w Odwołano się do klasy
CComMultiThreadModel CComCriticalSection
CComSingleThreadModel CComFakeCriticalSection
CComMultiThreadModelNoCS CComFakeCriticalSection

Oprócz CriticalSectionfunkcji można użyć typedef nazwy AutoCriticalSection. Nie należy określać AutoCriticalSection w obiektach globalnych lub statycznych składowych klas, jeśli chcesz wyeliminować kod uruchamiania CRT.

Przykład

Zobacz CComMultiThreadModel::AutoCriticalSection.

CComMultiThreadModel::D ecrement

Ta funkcja statyczna wywołuje funkcję Win32 InterlockedDecrement, która dekrementuje wartość zmiennej wskazywanej przez p.

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

Parametry

p
[in] Wskaźnik do zmiennej, która ma zostać zdekrementowana.

Wartość zwracana

Jeśli wynik dekrementacji wynosi 0, Decrement zwraca wartość 0. Jeśli wynik dekrementu jest niezerowy, zwracana wartość jest również niezerowa, ale może nie być równa wyniku dekrementacji.

Uwagi

InterlockedDecrement zapobiega jednoczesnemu używaniu tej zmiennej więcej niż jeden wątek.

CComMultiThreadModel::Increment

Ta funkcja statyczna wywołuje funkcję Win32 InterlockedIncrement, co zwiększa wartość zmiennej wskazywanej przez p.

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

Parametry

p
[in] Wskaźnik do zmiennej, która ma być zwiększana.

Wartość zwracana

Jeśli wynik przyrostu wynosi 0, Increment zwraca wartość 0. Jeśli wynik przyrostu jest niezerowy, zwracana wartość jest również niezerowa, ale może nie być równa wynikowi przyrostu.

Uwagi

InterlockedIncrement zapobiega jednoczesnemu używaniu tej zmiennej więcej niż jeden wątek.

CComMultiThreadModel::ThreadModelNoCS

W przypadku używania metody CComMultiThreadModeltypedef nazwa ThreadModelNoCS odwołuje się do klasy CComMultiThreadModelNoCS.

typedef CComMultiThreadModelNoCS ThreadModelNoCS;

Uwagi

CComMultiThreadModelNoCS Zapewnia bezpieczne wątkowo metody inkrementacji i dekrementacji zmiennej; nie zawiera jednak sekcji krytycznej.

CComSingleThreadModel oraz CComMultiThreadModelNoCS zawiera definicje dla elementu ThreadModelNoCS. W poniższej tabeli przedstawiono relację między klasą modelu wątkowania a klasą przywołyną przez ThreadModelNoCS:

Klasa zdefiniowana w Odwołano się do klasy
CComMultiThreadModel CComMultiThreadModelNoCS
CComSingleThreadModel CComSingleThreadModel
CComMultiThreadModelNoCS CComMultiThreadModelNoCS

Przykład

Zobacz CComMultiThreadModel::AutoCriticalSection.

Zobacz też

Klasa CComSingleThreadModel
Klasa CComAutoCriticalSection
Klasa CComCriticalSection
Omówienie klasy