
Ein Objekt der Klasse CSemaphore darstellt einen "Semaphor" — ein Synchronisierungsobjekt, das eine begrenzte Anzahl von Threads in einem oder mehreren Prozessen Zugriff auf eine Ressource ermöglicht. Ein CSemaphore -Objekt verwaltet die Anzahl der Threads, die derzeit auf eine angegebene Ressource zugreifen.
Semaphoren sind nützlich bei der Steuerung des Zugriffs auf eine freigegebene Ressource, die nur eine begrenzte Anzahl von Benutzern unterstützen kann. Die aktuelle Anzahl von CSemaphore -Objekt ist die Anzahl der zusätzlichen Benutzer erlaubt. Wenn die Anzahl Null erreicht, alle Versuche, die Ressource gesteuert, indem die CSemaphore -Objekt werden in einer Systemwarteschlange eingefügt und warten, bis sie entweder Zeitüberschreitung oder die Anzahl die erhebt sich über 0. Die maximale Anzahl von Benutzern, die gesteuerte Ressource, zu einer Zeit zugreifen kann wird während der Konstruktion des Objekts CSemaphore angegeben.
Um ein CSemaphore -Objekt verwenden, konstruieren Sie das CSemaphore -Objekt wenn es benötigt wird. Geben Sie den Namen der das Semaphor warten möchten, und die Anwendung sollte zunächst selbst. Sie können das Semaphor dann zugreifen, wenn der Konstruktor zurückgegeben. CSyncObject::Unlock aufrufen, wenn Sie fertig sind auf die gesteuerte Ressource zugreifen.
Eine alternative Methode zum verwenden CSemaphore Objekte ist eine Variable des Typs CSemaphore als Datenmember der Klasse hinzu, die Sie steuern möchten. Während des Baus des kontrollierten Objekts rufen Sie den Konstruktor von der CSemaphore -Datenmember angeben, den ersten Zugriff Graf, maximalen Zugang Anzahl, Name des Semaphore (wenn es über Prozessgrenzen hinweg verwendet wird), und gewünschten Sicherheitsattribute.
Um Zugriff auf Ressourcen gesteuerten CSemaphore Objekte auf diese Weise erstellen Sie zunächst eine Variable des Typs CSingleLock , oder geben Sie CMultiLock in Ihre Ressource Zugriff Member-Funktion. Rufen Sie dann das Lock-Objekt Lock -Memberfunktion (z. B. CSingleLock::Lock). An dieser Stelle wird der Thread entweder auf die Ressource zugreifen, warten, bis die Ressource freigegeben werden und Zugriff, oder warten, bis die Ressource freigegeben werden und die Zeit aus, nicht auf die Ressource zugreifen. In jedem Fall wurde die Ressource in einer threadsicheren Weise abgerufen. Um die Ressourcen freizugeben, verwenden Sie das Sperrobjekt Unlock -Member-Funktion (z. B. CSingleLock::Unlock) oder erlauben Sie das Lock-Objekt außerhalb des Gültigkeitsbereichs fallen.
Alternativ können Sie erstellen ein CSemaphore -Objekt Stand-Alone und es explizit zugreifen, bevor Sie auf die gesteuerte Ressource zugreifen. Diese Methode, während klarer, jemand liest den Quellcode ist anfälliger für Fehler.
Weitere Informationen zum Verwenden Sie CSemaphore Objekte finden Sie im Artikel Multithreading: Verwendung die Synchronisierungsklassen im Visual C++ Programmer's Guide.
# include lt;afxmt.h>
Klasse&nmember |nbsp; Basisklasse | Hierarchiediagramm
Beispiel&Nbsp; MFC-Beispiel MUTEXE