Вы можете сойти с именного семафора. Семафор - это, по сути, подсчет, он позволяет разработчикам ограничивать число потоков / процессов, обращающихся к какому-либо ресурсу. Обычно это работает так
- Вы создаете семафор с максимальным числом N.
- N потоков вызывают функцию ожидания,
WaitForSingleObject
или аналогичную, и каждый из них продолжается без ожидания. Каждый раз, когда внутренний счетчик семафоров выключается.
- N + 1 поток также вызывает функцию ожидания, но поскольку внутренний счетчик нашего семафора теперь равен 0, он должен ждать.
- Один из наших первых N потоков освобождает семафор, вызывая функцию
ReleaseSemaphore
. Эта функция увеличивает внутренний счетчик семафора.
- Наш ожидающий поток не должен ждать сейчас, поэтому он возобновляет работу, но счетчик семафоров возвращается к 0.
Я не думаю, что именно так вы и хотите его использовать. Итак, вместо этого вы должны:
- Создание именованного семафора с нулевым начальным счетчиком.
- Когда приложение запустится, немедленно отпустите его, увеличив счетчик. Во время этого вызова вы получите предыдущее значение счетчика.
- Когда приложение заканчивается, звоните
WaitForSingleObject(hSemaphore, 0)
, уменьшая счетчик. 0 означает, что вы не хотите ждать.
Это все довольно просто.
В С ++
//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);
Имена и BIG_NUMBER должны быть одинаковыми.
Если этого недостаточно для вашей задачи, вам придется заглянуть в общую память и заблокировать доступ к ней, хотя она называется mutex, но это немного сложнее.