Почему эти 4 потока блокируются при использовании семафора? - PullRequest
0 голосов
/ 27 апреля 2018

В системе, которая может иметь много-много потоков, я пытаюсь убедиться, что только четыре экземпляра класса создаются одновременно и могут быть освобождены через 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(); и никогда не продвигается дальше.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы создаете Semaphore таким образом, что все записи были зарезервированы. Конструктор Semaphore с двумя аргументами может сказать следующее:

Если initialCount меньше MaximumCount , эффект такой же, как если бы текущий поток вызвал WaitOne ( MaximumCount минус initialCount ) раз. Если вы не хотите резервировать какие-либо записи для потока, создающего семафор, используйте тот же номер для MaximumCount и initialCount .

Так что внесите это изменение:

private static readonly Semaphore mutablelock = new Semaphore(4, 4);
...