Проблема с памятью в очереди, которая работает в нескольких потоках - PullRequest
0 голосов
/ 07 июля 2019

Моя программа работает с очередью и большим файлом. Я работаю с очередью в нескольких потоках, и в какой-то момент возникает OutOfMemoryException из-за слишком большого количества объектов, помещенных в очередь в первом потоке в очереди. Им не удается удалить из очереди второй поток так быстро, как требуется.

P.S. Я могу использовать только примитивы синхронизации (Thread, Monitor)

Я уже написал код, который работает с не очень большими данными. Я знаю, что могу сделать Thread.Sleep (и это работает, я пробовал), когда в моей очереди существует определенное количество объектов. Насколько я знаю, это не лучшее решение

class SynchronizedQueue
{
    protected readonly object locker = new object();

    protected Queue<BlockData> queue = new Queue<BlockData>();

    public int Counter { get; set; }

    public bool IsClose { get; set; }

    public bool TryDequeue(out BlockData blockData)
    {
        lock (locker)
        {
            while (queue.Count == 0)
            {
                if (IsClose)
                {
                    blockData = new BlockData();
                    return false;
                }
                Monitor.Wait(locker);
            }

            blockData = queue.Dequeue();
            return true;
        }
    }

    public void Close()
    {
        lock (locker)
        {
            IsClose = true;
            Monitor.PulseAll(locker);
        }
    }

    public void Enqueue(BlockData blockData)
    {
        lock (locker)
        {
            //That's what i want to avoid
            if (Counter == 1000)
            {
                Thread.Sleep(240);
            }
            if (IsClose)
                throw new InvalidOperationException("Work was canceled!");

            while (blockData.Id != Counter)
                Monitor.Wait(locker);

            queue.Enqueue(blockData);
            Counter++;
            Monitor.PulseAll(locker);
        }
    }
}

Что вы можете порекомендовать для синхронизации постановки / снятия с очереди и исключения OutOfMemoryException?

...