Udostępnij za pośrednictwem


Klasa CMutex

Reprezentuje "mutex" — obiekt synchronizacji, który umożliwia wzajemnie wykluczający się jeden wątek dostępu do zasobu.

Składnia

class CMutex : public CSyncObject

Elementy członkowskie

Konstruktory publiczne

Nazwa/nazwisko opis
CMutex::CMutex CMutex Tworzy obiekt.

Uwagi

Mutexes są przydatne, gdy tylko jeden wątek naraz może być dozwolony do modyfikowania danych lub innego kontrolowanego zasobu. Na przykład dodawanie węzłów do połączonej listy jest procesem, który powinien być dozwolony tylko przez jeden wątek naraz. Za pomocą obiektu do kontrolowania CMutex listy połączonej tylko jeden wątek jednocześnie może uzyskać dostęp do listy.

Aby użyć CMutex obiektu, skonstruuj CMutex obiekt w razie potrzeby. Określ nazwę mutexu, który chcesz zaczekać, i że aplikacja powinna początkowo być właścicielem. Następnie możesz uzyskać dostęp do mutexu po powrocie konstruktora. Wywołaj obiekt CSyncObject::Unlock po zakończeniu uzyskiwania dostępu do kontrolowanego zasobu.

Alternatywną metodą używania CMutex obiektów jest dodanie zmiennej typu CMutex jako składowej danych do klasy, którą chcesz kontrolować. Podczas budowy kontrolowanego obiektu wywołaj konstruktor CMutex elementu członkowskiego danych, określając, czy mutex jest początkowo własnością, nazwą mutexu (jeśli będzie używany przez granice procesu) i żądanymi atrybutami zabezpieczeń.

Aby uzyskać dostęp do zasobów kontrolowanych przez CMutex obiekty w ten sposób, najpierw utwórz zmienną typu CSingleLock lub wpisz CMultiLock w funkcji składowej dostępu zasobu. Następnie wywołaj funkcję składową obiektu Lock lock (na przykład CSingleLock::Lock). W tym momencie wątek uzyska dostęp do zasobu, poczekaj, aż zasób zostanie zwolniony i uzyska dostęp, albo zaczekaj, aż zasób zostanie zwolniony i upłynął limit czasu, nie uzyskasz dostępu do zasobu. W każdym razie zasób został dostępny w bezpieczny wątkowo sposób. Aby zwolnić zasób, użyj funkcji składowej obiektu Unlock blokady (na przykład CSingleLock::Unlock) lub zezwól obiektowi blokady na wyjście z zakresu.

Aby uzyskać więcej informacji na temat używania obiektów, zobacz artykuł Multithreading: How to Use the Synchronization Classes (Jak używać CMutex klas synchronizacji).

Hierarchia dziedziczenia

Obiekt CObject

CSyncObject

CMutex

Wymagania

Nagłówek: afxmt.h

CMutex::CMutex

Tworzy nazwany lub nienazwany CMutex obiekt.

CMutex(
    BOOL bInitiallyOwn = FALSE,
    LPCTSTR lpszName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);

Parametry

bInitiallyOwn
Określa, czy wątek tworzący CMutex obiekt początkowo ma dostęp do zasobu kontrolowanego przez mutex.

lpszName
CMutex Nazwa obiektu. Jeśli istnieje inny mutex o tej samej nazwie, należy podać wartość lpszName, jeśli obiekt będzie używany przez granice procesu. Jeśli wartość NULL, mutex będzie nienazwany. Jeśli nazwa jest zgodna z istniejącym mutexem, konstruktor tworzy nowy CMutex obiekt, który odwołuje się do mutexu tej nazwy. Jeśli nazwa jest zgodna z istniejącym obiektem synchronizacji, który nie jest mutexem, konstrukcja zakończy się niepowodzeniem.

lpsaAttribute
Atrybuty zabezpieczeń obiektu mutex. Aby uzyskać pełny opis tej struktury, zobacz SECURITY_ATTRIBUTES w zestawie Windows SDK.

Uwagi

Aby uzyskać dostęp do obiektu lub zwolnić CMutex go, utwórz obiekt CMultiLock lub CSingleLock i wywołaj jego funkcje składowe Lock and Unlock . CMutex Jeśli obiekt jest używany autonomicznie, wywołaj jego Unlock funkcję składową, aby ją zwolnić.

Ważne

Po utworzeniu CMutex obiektu użyj polecenia GetLastError , aby upewnić się, że mutex jeszcze nie istnieje. Jeśli mutex nie istnieje nieoczekiwanie, może wskazywać, że nieuczciwy proces kuca i może być zamierza użyć mutex złośliwie. W takim przypadku zalecaną procedurą świadomą zabezpieczeń jest zamknięcie uchwytu i kontynuowanie tak, jakby wystąpił błąd podczas tworzenia obiektu.

Zobacz też

Klasa CSyncObject
Wykres hierarchii