Re: Multithreading: как очередь, но вручную и красиво?
От: Aquilaware  
Дата: 10.02.26 18:06
Оценка:
Здравствуйте, netch80, Вы писали:

N>Какие есть варианты сделать это красиво без подобных ручных плясок?


Этот паттерн называется monitor.

Его красота в том, что он концептуально изолирован от типов данных, над которыми производится операция. Это может быть простая переменная, контейнер, всё что угодно что имеет изменяемое состояние.

Приведу пример как такая конструкция делается в C#:

Queue<int> jobs = new();

void AddJob(int job)
{
    lock (jobs)
    {
        // Добавляем задачу в очередь.
        jobs.Enqueue(job);

        // Сигнализируем о добавлении задачи.
        Monitor.Pulse(jobs);
    }
}

int GetJob()
{
    lock (jobs)
    {
        // Ждем появления задач.
        while (jobs.Count == 0)
            Monitor.Wait(jobs);

        // Забираем задачу из очереди.
        return jobs.Dequeue();
    }    
}


Как видно из кода, никакого ручного освобождения. Все эти подоперации удобно интегрированы в высокоуровневые операции монитора.
Отредактировано 10.02.2026 18:09 Aquilaware . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.