Информация об изменениях

Сообщение Re: Multithreading: как очередь, но вручную и красиво? от 10.02.2026 18:06

Изменено 10.02.2026 18:09 Aquilaware

Re: Multithreading: как очередь, но вручную и красиво?
Здравствуйте, netch80, Вы писали:

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


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

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

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

Queue<int> jobs = new();

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

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

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

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


Как видно из кода, никакого ручного освобождения. Все эти подоперации удобно интегрированы в высокоуровневые операции монитора.
Re: Multithreading: как очередь, но вручную и красиво?
Здравствуйте, 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();
    }    
}


Как видно из кода, никакого ручного освобождения. Все эти подоперации удобно интегрированы в высокоуровневые операции монитора.