In letzter Zeit haben einige Leser einen bekannten Win32-Semaphor qualifiziert, der den Fehlercode verfolgt. Es gibt eine Reihe von Faktoren, die diese Aufgabe verursachen können. Schauen wir uns jetzt die Leute an.

 

 

Dank eines Win32-Semaphors gibt es diese Art von “Kontrollkonto” nicht, was vermutlich der Grund dafür ist, warum Ihre ganze Familie es nicht bekommen kann.

Ich sage anscheinend, dass die Anzahl der Semaphoren wahrscheinlich irgendwann einen großen Unterschied machen wird, aber aus der Perspektive einer Person in den meisten Teilen der Kette, es sei denn, es werden Schritte unternommen, um die Anzahl der Semaphoren endgültig zu erhöhen oder zu verringern Semaphoren. ein Thread kann jede zurückgegebene Antwort völlig ungültig machen, wenn sie ohne Frage endgültig berechnet wird.

Für diese Erläuterung bieten die Windows-API-Synchronisierungsfunktionen nicht die Möglichkeit, die vorherige Anzahl von Rastern ohne Nebenwirkungen zu bestätigen. Das Ergebnis der Hand stellt sicher, dass Sie ein praktikables Zeitfenster haben, um jeden unserer Werte auf sinnvolle Weise anzuzeigen.

  LONG-Konto = 0;if (WAIT_OBJECT_0 == WaitForSingleObject (hSemaphore, 0L))  // die spezifische Anzahl von Semaphoren ist mindestens eins. ReleaseSemaphore (hSemaphore, 1 & count); 

win32 be Semaphore count

Warum ist es deutlich besser? Natürlich nicht. Möglicherweise, aber derzeit gibt es ein Programm, das zwischen Halten und Freigeben etwas Nützliches tut, was wiederum eine Race-Bedingung verursachen würde, solange ReleaseSemaphore Null freigeben durfte.

Ein Semaphor-Objekt ist ein neuer Synchronisationsartikel, der eine Zählung von absolut nein bis zum angegebenen Höchstwert beibehält. Der Zähler ist jeweils ein reduzierter freier Zeitpunkt, während dem der Thread aufgrund des Semaphorobjekts abgeschaltet wurde, sowie der wird einzeln inkrementiert, wenn die Zeile die Semaphoren freigibt. Wenn die Zählerspitze Null erreicht, können im Wesentlichen keine Threads warten, bis der Zustand des typischen Semaphorobjekts angezeigt wird. Der Semaphor-Zustand wird auf Signal gesetzt, wenn dieser Zählerstand größer als Null ist, wird nicht signalisiert, und zusätzlich, wenn sein Zählerstand 9 wird.

Ein Semaphor-Objekt, das buchstäblich nützlich ist, besteht darin, einen Besitz abzulegen, mit dem eine begrenzte Anzahl von Käufern umgehen kann. Beispielsweise kann ein Gerät eine Begrenzung der Anzahl der Fenster haben, die es bilden kann. Es verwendet ein Semaphor mit einer identischen maximalen Zahl am Umfang des Fensters, verringert die benutzerdefinierte Zahl, wenn das Fenster am wahrscheinlichsten erstellt werden soll, und erhöht diese Methode, wenn das Fenster geschlossen wird. Attachedit wird nicht zu einem Semaphor-Spielzeug, wenn eine der Verschiebefunktionen erfolgreich aufgerufen wird, bevor jedes Fenster erstellt wird. Der Zeitpunktzähler ist null – dies fördert das Erreichen des Hausfensterlimits – das Timeout bezüglich des Jobs blockiert die Ausführung des Fenstererstellungscodes.

Der Thread

Careful verwendet den Job CreateSemaphore CreateSemaphoreEx plus, um ein Semaphorprodukt zu erstellen. Der Erstellungsthread meldet die vorläufige Gesamtzahl und die maximale Anzahl von Konten während des Objekts. Der mit dem Zähler verknüpfte Anfangswert darf nicht größer als Null oder größer als der Großteil des Maximalwerts sein. Der Ära-Thread wird dem Unternehmen auch einen Hinweis auf die Semaphor-Idee der Person geben. Andere Verarbeitungs-Threads können ein vertrauenswürdiges Handle öffnen, um eine Semaphor-Entität zu aktivieren, indem sie den Firmennamen beim Aufruf einer einzelnen OpenSemaphore -Funktion angeben. Weitere Vorschläge zu den Namen der Mutex-, Event-, Semaphore- und Timer-Objekte finden Sie unter Synchronisierung zwischen Prozessen .

Wenn der Semaphor auf mehr als einen Thread wartet, ist es möglich, dass ein wartender Thread ausgewählt wurde. Bereiten Sie sich nicht auf First-in-First-out-Prinzipien (FIFO) vor. Externe Ereignisse, d. h. etwas, das APCs im Kernelmodus die Reihenfolge der Warteschlange ändern können.

Jedes Mal, wenn eine der Wartefunktionen aufgrund eines positiven Semaphor-Expressionssignals zurückkehrt, wird die Anzahl der Semaphoren um ein Vielfaches verringert. Die Funktion ReleaseSemaphore addiert die Semaphore-Nummer um einen bestimmten Betrag. Die Zahl kann in der Tat niemals kleiner als Null oder größer als der Maximalwert sein.

win32 Get Semaphore Count

Die wahre Semaphore-Nummer wird normalerweise auf den maximalen Wert gesetzt. Der Zähler wird dann zweifelsohne auf den entsprechenden Grad dekrementiert, da die geschützte Ressource definitiv stark genutzt wird. Alternativ können Sie ein einzelnes Semaphor mit einem Stop-Seed zusammenstellen, um den Zugriff auf die Sicherheitstechniken einer bestimmten Anwendung zu blockieren, während der Referenzpunkt als initialisiert betrachtet wird. Wird nach der Initialisierung wahrscheinlich ReleaseSemaphore verwenden, um den effizientesten Wert zu berechnen.

Der Thread, der das Mutex-Objekt verwenden kann, kann einfach kontinuierlich einfrieren, bis das Ziel unseres Mutex gemeldet wird, ohne seine tatsächliche Implementierung zu blockieren. Jedoch wird ein Thread, der immer wieder am gleichen Faktor mit dem Emaphorprodukt festhält, die Anzahl der Semaphoren jedes Mal verringern, wenn das Just Wait tatsächlich endet; der Draht wird zugeschlagen, wenn alles auf Null zählt. Ebenso hat ein Thread die volle Eigentümerschaft, durch die ein einzelner Mutex erfolgreich einen ReleaseMutex -Job ausführen kann, obwohl jeder Thread ReleaseSemaphore verbrauchen kann, um die Lautstärke zu erhöhen. Die Nummer des am besten geeigneten Semaphorobjekts.

Ein Thread kann die Anzahl der tatsächlichen Semaphoren etwas mehr als einmal reduzieren, indem er im Wesentlichen eine neue, gleiche Idee eines Semaphors wiederholt, der Aufrufe an eine der derzeit genauen Wartefunktionen durch Aufdecken eines großen Arrays trägt mit unzähligen Deskriptoren für den gleichen Semaphor … erfordern definitiv keine mehrfachen Dekremente.

Wenn Sie mit der Verwendung des Semaphor-Stücks fertig sind, rufen Sie diese spezielle CloseHandle -Funktion auf, um das Hosting zu schließen. Das Semaphorobjekt wird zerstört, wenn Ihre Organisation das letzte Handle schließt. Das Schließen des Grifftyps ändert nichts an der Vielzahl der Semaphoren; Daher müssen Sie unbedingt ReleaseSemaphore vor dem letzten Handle aufrufen oder bevor ich den Prozess beenden würde. Andernfalls laufen ausstehende Operationen immer wieder ab oder werden auf unbestimmte Zeit fortgesetzt, je nachdem, ob ein Zeitüberschreitungswert angegeben wurde.

Verwenden Sie einen großen Semaphor