В системе, которая может иметь много-много потоков, я пытаюсь убедиться, что только четыре экземпляра класса создаются одновременно и могут быть освобождены через 5-60 секунд. Экземпляры создаются в начале каждого потока и уничтожаются при завершении процесса в потоке.
Я также хочу предотвратить создание только одного экземпляра за раз. Поэтому моя логика заключается в том, чтобы использовать блокировку во время создания объекта, а также обернуть всю логику потока семафором.
private static readonly object padlock = new object();
private static readonly Semaphore mutablelock = new Semaphore(0, 4);
// called at the start of a long running thread
public static Object GetNewInstance()
{
// semaphore used to prevent more than 4 objects from existing at any time
mutablelock.WaitOne();
// lock used to prevent more than one object being instantiated at a time
lock (padlock)
{
var instance = new Object();
return instance;
}
}
// called at the end of a long running thread
public static void ReleaseInstance()
{
mutablelock.Release();
}
Программа имеет четыре потока, каждый из которых (при просмотре с точками остановки отладки) останавливается на линии mutablelock.WaitOne();
и никогда не продвигается дальше.