Share via


CSemaphore-Klasse

Ein Objekt der Klasse CSemaphore stellt einen "Semaphor" dar – ein Synchronisierungsobjekt, das eine begrenzte Anzahl von Threads in einem oder mehreren Prozessen ermöglicht, auf eine Anzahl der Threads zuzugreifen, die derzeit auf eine angegebene Ressource zugreifen.

Syntax

class CSemaphore : public CSyncObject

Member

Öffentliche Konstruktoren

Name Beschreibung
CSemaphor::CSemaphor 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 zusätzlichen 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 über 0 steigt. 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 CSyncObject::Unlock auf, 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 wurde 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 einem vorhandenen Synchronisierungsobjekt entspricht, 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- oder CSingleLock-Objekt, und rufen Sie dessen Lock- und Unlock-Memberfunktionen auf.

Wichtig

Verwenden Sie nach dem Erstellen des CSemaphore Objekts GetLastError, um sicherzustellen, dass der 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