Usted puede salirse con semáforo con nombre. Semáforo es básicamente un conteo, está aquí para permitir a los desarrolladores limitar el número de subprocesos/procesos que están accediendo a algún recurso. Por lo general, funciona de esa manera
- Se crea un semáforo con la máxima N. recuento
- N hilos función Llamada en espera en él,
WaitForSingleObject
o similar y cada uno de ellos van sin esperar. Cada vez que el contador interno de semáforos baja.
- N + 1 hilo también llama a la función de espera pero debido a que el contador interno de nuestro semáforo ahora es 0, tiene que esperar.
- Uno de nuestros primeros N subprocesos libera el semáforo llamando a la función
ReleaseSemaphore
. Esta función incrementa el contador interno del semáforo.
- Nuestro hilo de espera no tienen que esperar ahora, por lo que se reanuda pero semáforo contador vuelve a 0.
No creo que esta es la forma en que desea utilizar sin embargo. Por lo tanto, en su lugar, debe:
- Cree el semáforo con nombre con el contador inicial establecido en cero.
- Cuando se inicia la aplicación, suéltelo de inmediato, aumentando el contador. Obtendrás el valor del contador anterior durante esa llamada.
- Cuando la aplicación finaliza, llame al
WaitForSingleObject(hSemaphore, 0)
, disminuyendo el contador. 0 significa que no quiere esperar.
Esto es todo bastante fácil.
En 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);
En 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);
Nombres y BIG_NUMBERs debe ser el mismo, obviamente.
Si esto no es suficiente para su tarea, tendrá que buscar en la memoria compartida y bloquear el acceso a ella a través del nombre mutex, pero eso es un poco más complicado.
¿Esto es en Windows o en varios sistemas operativos? –
El principal problema que veo es que su requisito establece que si el programa falla, desea que el valor disminuya. Esto sería razonablemente difícil de lograr con cualquier fiabilidad. – ScaryAardvark
@Scary: si detecta todas las excepciones, debería poder reducir aún más. Si mata el proceso, está atascado a menos que cambie el valor en la memoria cuando se inicia un proceso y no se cuelga entre el inicio y el cambio del mutex ... –