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
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.