Sie könnten mit dem Namen Semaphor durchkommen. Semaphore ist im Grunde eine Zählung, die es Entwicklern ermöglicht, die Anzahl der Threads/Prozesse, die auf eine Ressource zugreifen, zu begrenzen. Normalerweise funktioniert das so
- Sie erstellen eine Semaphore mit der maximalen Anzahl N.
- N Threads rufen eine Wartefunktion auf,
WaitForSingleObject
oder ähnliches und jeder von ihnen macht weiter, ohne zu warten. Jedes Mal geht der interne Semaphore-Zähler zurück.
- N+1-Thread ruft ebenfalls die Wartefunktion auf, aber da der interne Zähler unserer Semaphore jetzt 0 ist, muss er warten.
- Einer unserer ersten N Threads gibt die Semaphore durch den Aufruf
ReleaseSemaphore
Funktion. Diese Funktion inkrementiert den internen Zähler der Semaphore.
- Unser wartender Thread muss jetzt nicht mehr warten, also wird er fortgesetzt, aber der Semaphorenzähler geht auf 0 zurück.
Ich glaube aber nicht, dass Sie es so verwenden wollen. Also, stattdessen sollten Sie:
- Erzeugen einer benannten Semaphore mit einem auf Null gesetzten Anfangszähler.
- Wenn die Anwendung beginnt, lassen Sie sie sofort los und erhöhen Sie den Zähler. Während dieses Aufrufs erhalten Sie den vorherigen Zählerstand.
- Wenn die Anwendung endet, rufen Sie
WaitForSingleObject(hSemaphore, 0)
, wodurch der Zähler verringert wird. 0 bedeutet, dass Sie nicht warten wollen.
Das ist alles ganz einfach.
In C++
//create semaphore
HANDLER hSemaphore = CreateSemaphore(NULL, 0, BIG_NUMBER, "My cool semaphore name");
//increase counter
LONG prev_counter;
ReleaseSemaphore(hSemaphore, 1, &prev_counter);
//decrease counter
WaitForSingleObject(hSemaphore, 0);
In C#
using System.Threading;
//create semaphore
Semaphore sem = new Semaphore(0, BIG_NUMBER, "My cool semaphore name");
//increase counter
int prev_counter = sem.Release();
//decrease counter
sem.WaitOne(0);
Die Namen und BIG_NUMBERs sollten natürlich gleich sein.
Wenn dies für Ihre Aufgabe nicht ausreicht, müssen Sie sich mit gemeinsam genutztem Speicher befassen und den Zugriff darauf durch eine benannte Mutex sperren, aber das ist ein wenig komplizierter.