Freigeben über


CSemaphore-Klasse

Ein Objekt der Klasse CSemaphore stellt ein "Semaphor" dar. Ein Semaphor ist ein Synchronisierungsobjekt, das den Zugriff auf freigegebene Ressourcen steuert und Rennbedingungen verhindert.

Syntax

class CSemaphore : public CSyncObject

Member

Öffentliche Konstruktoren

Name Beschreibung
CSemaphore::CSemaphore Erstellt ein CSemaphore-Objekt.

Hinweise

Semaphore sind nützlich beim Steuern des Zugriffs auf eine freigegebene Ressource, die nur eine begrenzte Anzahl von Benutzern unterstützen kann. Die aktuelle Anzahl des CSemaphore Objekts ist die Anzahl der zulässigen anderen Benutzer. Wenn die Anzahl null erreicht, werden alle Versuche, die vom CSemaphore Objekt kontrollierte Ressource zu verwenden, in eine Systemwarteschlange eingefügt und warten, bis sie entweder timeout sind, oder die Anzahl steigt über 0. Die maximale Anzahl von Benutzern, die gleichzeitig auf die kontrollierte Ressource zugreifen können, wird während der Erstellung des CSemaphore Objekts angegeben.

Um ein CSemaphore Objekt zu verwenden, erstellen Sie das CSemaphore Objekt bei Bedarf. Geben Sie den Namen des Semaphors an, auf das Sie warten möchten, und dass Ihre Anwendung sie zunächst besitzen soll. Sie können dann auf das Semaphor zugreifen, wenn der Konstruktor zurückgegeben wird. Rufen Sie auf CSyncObject::Unlock , wenn Sie mit dem Zugriff auf die kontrollierte Ressource fertig sind.

Eine alternative Methode zum Verwenden von CSemaphore Objekten besteht darin, der Klasse, die Sie steuern möchten, eine Variable vom Typ CSemaphore als Datenmememm hinzuzufügen. Rufen Sie beim Erstellen des gesteuerten Objekts den Konstruktor des CSemaphore Datenmemers auf, der die anfängliche Zugriffsanzahl, die maximale Zugriffsanzahl, den Namen des Semaphors (sofern es über Prozessgrenzen hinweg verwendet wird) und die gewünschten Sicherheitsattribute angibt.

Um auf Ressourcen zuzugreifen, die von CSemaphore Objekten auf diese Weise gesteuert werden, erstellen Sie zuerst eine Variable vom Typ "CSingleLock " oder " CMultiLock " in der Access-Memberfunktion Ihrer Ressource. Rufen Sie dann die Memberfunktion des Sperrobjekts Lock auf (z . B. CSingleLock::Lock). An diesem Punkt erhält Ihr Thread entweder Zugriff auf die Ressource, wartet auf die Freigabe der Ressource und erhält Zugriff, oder warten Sie, bis die Ressource freigegeben und timeout ist, wenn sie keinen Zugriff auf die Ressource erhält. In jedem Fall wird auf Ihre Ressource auf threadsichere Weise zugegriffen. Verwenden Sie zum Freigeben der Ressource die Memberfunktion des Sperrobjekts Unlock (z . B. CSingleLock::Unlock), oder lassen Sie zu, dass das Sperrobjekt aus dem Bereich fällt.

Alternativ können Sie ein CSemaphore Eigenständiges Objekt erstellen und explizit darauf zugreifen, bevor Sie versuchen, auf die kontrollierte Ressource zuzugreifen. Diese Methode ist zwar klarer für jemanden, der Ihren Quellcode liest, fehleranfälliger.

Weitere Informationen zur Verwendung von CSemaphore Objekten finden Sie im Artikel Multithreading: Verwenden der Synchronisierungsklassen.

Vererbungshierarchie

CObject

CSyncObject

CSemaphore

Anforderungen

Kopfzeile: afxmt.h

CSemaphor::CSemaphor

Erstellt ein benanntes oder nicht benanntes CSemaphore Objekt.

CSemaphore(
    LONG lInitialCount = 1,
    LONG lMaxCount = 1,
    LPCTSTR pstrName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);

Parameter

lInitialCount
Die anfängliche Verwendungsanzahl für das Semaphor. Muss größer oder gleich 0 und kleiner als oder gleich lMaxCount sein.

lMaxCount
Die maximale Nutzungsanzahl für das Semaphor. Muss größer als 0 sein.

pstrName
Der Name des Semaphors. Muss angegeben werden, wenn auf das Semaphor über Prozessgrenzen hinweg zugegriffen wird. Wenn NULL, wird das Objekt unbenannt. Wenn der Name einem vorhandenen Semaphor entspricht, erstellt der Konstruktor ein neues CSemaphore Objekt, das auf das Semaphor dieses Namens verweist. Wenn der Name mit einem vorhandenen Synchronisierungsobjekt übereinstimmt, das kein Semaphor ist, schlägt die Konstruktion fehl.

lpsaAttributes
Sicherheitsattribute für das Semaphorobjekt. Eine vollständige Beschreibung dieser Struktur finden Sie unter SECURITY_ATTRIBUTES im Windows SDK.

Hinweise

Um auf ein CSemaphore Objekt zuzugreifen oder freizugeben, erstellen Sie ein CMultiLock Objekt, CSingleLock und rufen Sie dessen Lock Memberfunktionen auf und entsperren sie auf.

Wichtig

Verwenden Sie CSemaphore nach dem Erstellen des GetLastError Objekts, um sicherzustellen, dass das Mutex noch nicht vorhanden war. Wenn der Mutex unerwartet vorhanden ist, kann es darauf hindeuten, dass ein nicht autorisierter Prozess gleicht und möglicherweise beabsichtigt, den Mutex böswillig zu verwenden. In diesem Fall besteht die empfohlene sicherheitsbewusste Prozedur darin, das Handle zu schließen und fortzusetzen, als ob beim Erstellen des Objekts ein Fehler aufgetreten wäre.

Siehe auch

CSyncObject Klasse
Hierarchiediagramm