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