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 CComMultiThreadModel
typedef
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 AutoCriticalSection
funkcji 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 CComMultiThreadModel
metody 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 CriticalSection
funkcji 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 CComMultiThreadModel
typedef
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