Gibt es eine Möglichkeit, um herauszufinden, die aktuelle Anzahl der ein win32-semaphore?
Ich bin auf der Suche nach einem Weg, mit keine Nebenwirkungen.
Ideal, der folgende code würde den trick tun:
long currentCount = 0;
::ReleaseSemaphore(h, 0, ¤tCount);
Aber leider 0 ist nicht zulässig, da der Wert von lReleaseCount, so der Aufruf FALSE zurückgibt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass der Wert für externe überwachung (wie Sie vorschlagen, in deinem Kommentar), dann ist entweder der Vorherige Wert nach einem Aufruf
ReleaseSemaphore()
oder IMHO eine bessere Lösung ist es, dass Sie bei der Umsetzung Ihrer eigenen "verriegelt" - Zähler zusätzlich zu Ihrem semaphore; Sie haben dann Ihre überwachung zu zählen und es in irgendeiner Weise, die Sie mögen... Nur don ' T verwenden Sie es als eine Möglichkeit zu sehen, wenn Sie 'enter' die semaphore...Wie Chris richtig sagt, Sie können nicht erhalten die aktuelle Zählung als es ist potenziell immer ändern.
Diese vielleicht ein wenig zu spät, aber ich denke, NtQuerySemaphore() ist wahrscheinlich das, was Sie wollen, werfen Sie einen Blick auf.
Gibt es keine solche Sache wie eine "laufende Zählung" eine Win32-semaphore - und das ist, warum Sie nicht bekommen kann es.
Ich meine, offenkundig, irgendwann der Zeitpunkt der Zählung auf eine semaphore wird einige Wert, aber aus der Sicht eines Threads, es sei denn, es tritt in Aktion, um erhöhen oder verringern Sie die semaphore count, einem anderen thread machen könnte, keine Antwort abgerufen völlig unwirksam im moment ist es berechnet.
Es ist aus diesem Grund, dass windows-api-Synchronisation-Funktionen lassen Sie sich nicht, nehmen Sie das bisherige lock-count ohne eine Nebenwirkung. Die Nebenwirkung garantiert, dass Sie ein gültiges Fenster der Gelegenheit, um tatsächlich den Wert verwenden, der in einer sinnvollen Art und Weise.
Offensichtliche "umgehen" wäre, etwas zu tun, wie
Warum ist das besser? Ich bin mir nicht sicher. Aber vielleicht gibt es eine Möglichkeit, etwas sinnvolles tun zwischen warten und loslassen, das wäre eine race-Bedingung, wenn ReleaseSemaphore durfte zu release 0.
Sysinternals-tool Process Explorer anzeigen zu können, die Interna von win32-handles, darunter auch Ampeln und Ihre aktuellen/max zählt. Gut genug für die Fehlersuche, aber nicht so nützlich für die automatische überwachung.
Wenn Process Explorer kann es tun, können Sie wahrscheinlich auch ... aber es wird wahrscheinlich erfordern Tiefe Kenntnisse der windows-Interna.